From: Ilia Alshanetsky Date: Tue, 7 Jan 2003 02:21:58 +0000 (+0000) Subject: Changed perror() to php_error_docref(), fixed bug #21309. X-Git-Tag: PHP_4_3_before_13561_fix~109 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=794f365e4e1d49694b40426bf701fe90e43b98de;p=php Changed perror() to php_error_docref(), fixed bug #21309. Made extension use ZE memory allocation wrappers, fixed a memory leak in ftp_mkdir. Removed duplicate ftp_syst() call inside ftp_systype(). # A larger patch with CS fixes will be applied to HEAD shortly. --- diff --git a/ext/ftp/ftp.c b/ext/ftp/ftp.c index 72723b3009..7078124a79 100644 --- a/ext/ftp/ftp.c +++ b/ext/ftp/ftp.c @@ -122,11 +122,7 @@ ftp_open(const char *host, short port, long timeout_sec TSRMLS_DC) /* alloc the ftp structure */ - ftp = calloc(1, sizeof(*ftp)); - if (ftp == NULL) { - perror("calloc"); - return NULL; - } + ftp = ecalloc(1, sizeof(*ftp)); tv.tv_sec = timeout_sec; tv.tv_usec = 0; @@ -143,7 +139,7 @@ ftp_open(const char *host, short port, long timeout_sec TSRMLS_DC) size = sizeof(ftp->localaddr); memset(&ftp->localaddr, 0, size); if (getsockname(ftp->fd, (struct sockaddr*) &ftp->localaddr, (unsigned int*)&size) == -1) { - perror("getsockname"); + php_error_docref(NULL TSRMLS_CC, E_WARNING, "getsockname failed: %s (%d)\n", strerror(errno), errno); goto bail; } @@ -156,7 +152,7 @@ ftp_open(const char *host, short port, long timeout_sec TSRMLS_DC) bail: if (ftp->fd != -1) closesocket(ftp->fd); - free(ftp); + efree(ftp); return NULL; } /* }}} */ @@ -179,7 +175,7 @@ ftp_close(ftpbuf_t *ftp) closesocket(ftp->fd); } ftp_gc(ftp); - free(ftp); + efree(ftp); return NULL; } /* }}} */ @@ -192,10 +188,12 @@ ftp_gc(ftpbuf_t *ftp) if (ftp == NULL) return; - free(ftp->pwd); - ftp->pwd = NULL; - free(ftp->syst); - ftp->syst = NULL; + if (ftp->pwd) { + efree(ftp->pwd); + } + if (ftp->syst) { + efree(ftp->syst); + } } /* }}} */ @@ -212,8 +210,9 @@ ftp_quit(ftpbuf_t *ftp) if (!ftp_getresp(ftp) || ftp->resp != 221) return 0; - free(ftp->pwd); - ftp->pwd = NULL; + if (ftp->pwd) { + efree(ftp->pwd); + } return 1; } @@ -362,7 +361,7 @@ ftp_syst(ftpbuf_t *ftp) syst = ftp->inbuf; if ((end = strchr(syst, ' '))) *end = 0; - ftp->syst = strdup(syst); + ftp->syst = estrdup(syst); if (end) *end = ' '; @@ -392,9 +391,10 @@ ftp_pwd(ftpbuf_t *ftp) /* copy out the pwd from response */ if ((pwd = strchr(ftp->inbuf, '"')) == NULL) return NULL; - end = strrchr(++pwd, '"'); + if ((end = strrchr(++pwd, '"')) == NULL) + return NULL; *end = 0; - ftp->pwd = strdup(pwd); + ftp->pwd = estrdup(pwd); *end = '"'; return ftp->pwd; @@ -425,7 +425,7 @@ ftp_chdir(ftpbuf_t *ftp, const char *dir) if (ftp == NULL) return 0; - free(ftp->pwd); + efree(ftp->pwd); ftp->pwd = NULL; if (!ftp_putcmd(ftp, "CWD", dir)) @@ -445,7 +445,7 @@ ftp_cdup(ftpbuf_t *ftp) if (ftp == NULL) return 0; - free(ftp->pwd); + efree(ftp->pwd); ftp->pwd = NULL; if (!ftp_putcmd(ftp, "CDUP", NULL)) @@ -474,13 +474,14 @@ ftp_mkdir(ftpbuf_t *ftp, const char *dir) /* copy out the dir from response */ if ((mkd = strchr(ftp->inbuf, '"')) == NULL) { - mkd = strdup(dir); + mkd = estrdup(dir); return mkd; } - - end = strrchr(++mkd, '"'); + if ((end = strrchr(++mkd, '"')) == NULL) { + return NULL; + } *end = 0; - mkd = strdup(mkd); + mkd = estrdup(mkd); *end = '"'; return mkd; @@ -668,6 +669,10 @@ ftp_get(ftpbuf_t *ftp, php_stream *outstream, const char *path, ftptype_t type, ftp->data = data; if (resumepos>0) { + if (resumepos > 2147483647) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "PHP cannot handle files greater then 2147483647 bytes.\n"); + goto bail; + } sprintf(arg, "%u", resumepos); if (!ftp_putcmd(ftp, "REST", arg)) { goto bail; @@ -751,6 +756,10 @@ ftp_put(ftpbuf_t *ftp, const char *path, php_stream *instream, ftptype_t type, i ftp->data = data; if (startpos>0) { + if (startpos > 2147483647) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "PHP cannot handle files with a size greater then 2147483647 bytes.\n"); + goto bail; + } sprintf(arg, "%u", startpos); if (!ftp_putcmd(ftp, "REST", arg)) { goto bail; @@ -1240,11 +1249,7 @@ ftp_getdata(ftpbuf_t *ftp) return NULL; /* alloc the data structure */ - data = calloc(1, sizeof(*data)); - if (data == NULL) { - perror("calloc"); - return NULL; - } + data = ecalloc(1, sizeof(*data)); data->listener = -1; data->fd = -1; data->type = ftp->type; @@ -1252,7 +1257,7 @@ ftp_getdata(ftpbuf_t *ftp) sa = (struct sockaddr *) &ftp->localaddr; /* bind/listen */ if ((fd = socket(sa->sa_family, SOCK_STREAM, 0)) == -1) { - perror("socket"); + php_error_docref(NULL TSRMLS_CC, E_WARNING, "socket() failed: %s (%d)\n", strerror(errno), errno); goto bail; } @@ -1267,7 +1272,7 @@ ftp_getdata(ftpbuf_t *ftp) tv.tv_sec = ftp->timeout_sec; tv.tv_usec = 0; if (php_connect_nonb(fd, (struct sockaddr*) &ftp->pasvaddr, size, &tv) == -1) { - perror("connect"); + php_error_docref(NULL TSRMLS_CC, E_WARNING, "php_connect_nonb() failed: %s (%d)\n", strerror(errno), errno); goto bail; } @@ -1285,17 +1290,17 @@ ftp_getdata(ftpbuf_t *ftp) size = php_sockaddr_size(&addr); if (bind(fd, (struct sockaddr*) &addr, size) == -1) { - perror("bind"); + php_error_docref(NULL TSRMLS_CC, E_WARNING, "bind() failed: %s (%d)\n", strerror(errno), errno); goto bail; } if (getsockname(fd, (struct sockaddr*) &addr, (unsigned int*)&size) == -1) { - perror("getsockname"); + php_error_docref(NULL TSRMLS_CC, E_WARNING, "getsockname() failed: %s (%d)\n", strerror(errno), errno); goto bail; } if (listen(fd, 5) == -1) { - perror("listen"); + php_error_docref(NULL TSRMLS_CC, E_WARNING, "listen() failed: %s (%d)\n", strerror(errno), errno); goto bail; } @@ -1338,7 +1343,7 @@ ftp_getdata(ftpbuf_t *ftp) bail: if (fd != -1) closesocket(fd); - free(data); + efree(data); return NULL; } /* }}} */ @@ -1365,7 +1370,7 @@ data_accept(databuf_t *data, ftpbuf_t *ftp) data->listener = -1; if (data->fd == -1) { - free(data); + efree(data); return NULL; } @@ -1437,7 +1442,7 @@ data_close(ftpbuf_t *ftp, databuf_t *data) if (ftp) { ftp->data = NULL; } - free(data); + efree(data); return NULL; } /* }}} */ @@ -1505,11 +1510,7 @@ ftp_genlist(ftpbuf_t *ftp, const char *cmd, const char *path) rewind(tmpfp); - ret = malloc((lines + 1) * sizeof(char**) + size * sizeof(char*)); - if (ret == NULL) { - perror("malloc"); - goto bail; - } + ret = emalloc((lines + 1) * sizeof(char**) + size * sizeof(char*)); entry = ret; text = (char*) (ret + lines + 1); @@ -1533,7 +1534,7 @@ ftp_genlist(ftpbuf_t *ftp, const char *cmd, const char *path) fclose(tmpfp); if (!ftp_getresp(ftp) || (ftp->resp != 226 && ftp->resp != 250)) { - free(ret); + efree(ret); return NULL; } @@ -1541,7 +1542,7 @@ ftp_genlist(ftpbuf_t *ftp, const char *cmd, const char *path) bail: data_close(ftp, data); fclose(tmpfp); - free(ret); + efree(ret); return NULL; } /* }}} */ @@ -1680,6 +1681,10 @@ ftp_nb_put(ftpbuf_t *ftp, const char *path, php_stream *instream, ftptype_t type goto bail; if (startpos>0) { + if (startpos > 2147483647) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "PHP cannot handle files with a size greater then 2147483647 bytes.\n"); + goto bail; + } sprintf(arg, "%u", startpos); if (!ftp_putcmd(ftp, "REST", arg)) { goto bail; diff --git a/ext/ftp/php_ftp.c b/ext/ftp/php_ftp.c index 6d90aab252..03c86f7555 100644 --- a/ext/ftp/php_ftp.c +++ b/ext/ftp/php_ftp.c @@ -351,7 +351,7 @@ PHP_FUNCTION(ftp_mkdir) RETURN_FALSE; } - RETURN_STRING(tmp, 1); + RETURN_STRING(tmp, 0); } /* }}} */ @@ -403,7 +403,7 @@ PHP_FUNCTION(ftp_nlist) array_init(return_value); for (ptr = nlist; *ptr; ptr++) add_next_index_string(return_value, *ptr, 1); - free(nlist); + efree(nlist); } /* }}} */ @@ -431,7 +431,7 @@ PHP_FUNCTION(ftp_rawlist) array_init(return_value); for (ptr = llist; *ptr; ptr++) add_next_index_string(return_value, *ptr, 1); - free(llist); + efree(llist); } /* }}} */ @@ -449,7 +449,6 @@ PHP_FUNCTION(ftp_systype) ZEND_FETCH_RESOURCE(ftp, ftpbuf_t*, &z_ftp, -1, le_ftpbuf_name, le_ftpbuf); - syst = ftp_syst(ftp); if (NULL == (syst = ftp_syst(ftp))) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", ftp->inbuf); RETURN_FALSE;