[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH] don't use regexp in commit.c
[Thread Prev] | [Thread Next]
- Subject: [PATCH] don't use regexp in commit.c
- From: "Bernhard R. Link" <brlink@xxxxxxxxxx>
- Reply-to: libssh@xxxxxxxxxx
- Date: Fri, 11 Feb 2011 23:02:25 +0100
- To: libssh@xxxxxxxxxx
Remove the use of regexec in commit.c.
This fixes several problems of the old code by removing it:
- ssh_regex_init not checking malloc() result for NULL.
- connect.c setting _POSIX_C_SOURCE too late to have effect.
- this was most likely the reason config.h was not included
before the system headers (so this is added back)
- ssh_regex_init printing error message to stderro but
documentation saying it is "set".
- ssh_regex_init set only called by ssh_init, which documents
itself it may "be omitted if your program is not multithreaded"
(and i_regex not tested for NULL in connect.c)
---
Not tested at all...
include/libssh/priv.h | 2 -
src/connect.c | 76 +++++++++++++-----------------------------------
src/init.c | 3 --
3 files changed, 21 insertions(+), 60 deletions(-)
diff --git a/include/libssh/priv.h b/include/libssh/priv.h
index 66f24e2..4dbc445 100644
--- a/include/libssh/priv.h
+++ b/include/libssh/priv.h
@@ -172,8 +172,6 @@ void ssh_packet_set_callbacks(ssh_session session, ssh_packet_callbacks callback
void ssh_packet_set_default_callbacks(ssh_session session);
void ssh_packet_process(ssh_session session, uint8_t type);
/* connect.c */
-int ssh_regex_init(void);
-void ssh_regex_finalize(void);
socket_t ssh_connect_host(ssh_session session, const char *host,const char
*bind_addr, int port, long timeout, long usec);
socket_t ssh_connect_host_nonblocking(ssh_session session, const char *host,
diff --git a/src/connect.c b/src/connect.c
index ec0a2ca..b962c78 100644
--- a/src/connect.c
+++ b/src/connect.c
@@ -21,6 +21,8 @@
* MA 02111-1307, USA.
*/
+#include "config.h"
+
#include <errno.h>
#include <fcntl.h>
#include <stdio.h>
@@ -78,14 +80,6 @@
#error "Your system must have getaddrinfo()"
#endif
-#ifdef HAVE_REGCOMP
-/* don't declare gnu extended regexp's */
-#ifndef _POSIX_C_SOURCE
-#define _POSIX_C_SOURCE
-#endif
-#include <regex.h>
-#endif /* HAVE_REGCOMP */
-
#ifdef _WIN32
void ssh_sock_set_nonblocking(socket_t sock) {
u_long nonblocking = 1;
@@ -118,53 +112,27 @@ void ssh_sock_set_blocking(socket_t sock) {
#endif /* _WIN32 */
-#ifdef HAVE_REGCOMP
-#define IPEXPR "^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$"
-
-static regex_t *ip_regex = NULL;
-
-/** @internal
- * @brief initializes and compile the regexp to be used for IP matching
- * @returns -1 on error (and error message is set)
- * @returns 0 on success
- */
-int ssh_regex_init(){
- if(ip_regex==NULL){
- int err;
- regex_t *regex=malloc(sizeof (regex_t));
- ZERO_STRUCTP(regex);
- err = regcomp(regex, IPEXPR, REG_EXTENDED | REG_NOSUB);
- if(err != 0){
- char buffer[128];
- regerror(err,regex,buffer,sizeof(buffer));
- fprintf(stderr,"Error while compiling regular expression : %s\n",buffer);
- SAFE_FREE(regex);
- return -1;
- }
- ip_regex=regex;
- }
- return 0;
-}
-
-/** @internal
- * @brief clean up the IP regexp
- */
-void ssh_regex_finalize(){
- if(ip_regex){
- regfree(ip_regex);
- SAFE_FREE(ip_regex);
+static int isipaddr(const char *hostname) {
+ int number = 0, gotnumber = 0, block = 0;
+
+ for ( ; *hostname != '\0' ; hostname++) {
+ if (*hostname == '.') {
+ if (!gotnumber || block > 2 || number > 255)
+ return 0;
+ block++;
+ gotnumber = 0;
+ number = 0;
+ } else if (*hostname >= '0' && *hostname <= '9') {
+ gotnumber = 1;
+ if (number > 25)
+ return 0;
+ number = number*10 + (*hostname - '0');
+ } else
+ return 0;
}
+ return block == 3 && gotnumber && number <= 255;
}
-#else /* HAVE_REGCOMP */
-int ssh_regex_init(){
- return 0;
-}
-void ssh_regex_finalize(){
-}
-#endif
-
-
static int ssh_connect_socket_close(socket_t s){
#ifdef _WIN32
return closesocket(s);
@@ -194,13 +162,11 @@ static int getai(ssh_session session, const char *host, int port, struct addrinf
hints.ai_flags=AI_NUMERICSERV;
#endif
}
-#ifdef HAVE_REGCOMP
- if(regexec(ip_regex,host,0,NULL,0) == 0){
+ if(isipaddr(host)){
/* this is an IP address */
ssh_log(session,SSH_LOG_PACKET,"host %s matches an IP address",host);
hints.ai_flags |= AI_NUMERICHOST;
}
-#endif
return getaddrinfo(host, service, &hints, ai);
}
diff --git a/src/init.c b/src/init.c
index 385cb7a..7b29d2b 100644
--- a/src/init.c
+++ b/src/init.c
@@ -57,8 +57,6 @@ int ssh_init(void) {
return -1;
if(ssh_socket_init())
return -1;
- if(ssh_regex_init())
- return -1;
return 0;
}
@@ -74,7 +72,6 @@ int ssh_init(void) {
*/
int ssh_finalize(void) {
ssh_threads_finalize();
- ssh_regex_finalize();
ssh_crypto_finalize();
ssh_socket_cleanup();
#ifdef HAVE_LIBGCRYPT
--
1.5.6.5
| Re: [PATCH] don't use regexp in commit.c | "Bernhard R. Link" <brlink@xxxxxxxxxx> |
| Re: [PATCH] don't use regexp in commit.c | Aris Adamantiadis <aris@xxxxxxxxxxxx> |