merge 45152 don't leak descriptors in http.c

git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/1.4@46117 65c4cc65-6c06-0410-ace0-fbb531ad65f3
1.4
Luigi Rizzo 19 years ago
parent 50fda8522d
commit e6451274d2

@ -494,6 +494,8 @@ static void *http_root(void *data)
pthread_attr_t attr; pthread_attr_t attr;
for (;;) { for (;;) {
int flags;
ast_wait_for_input(httpfd, -1); ast_wait_for_input(httpfd, -1);
sinlen = sizeof(sin); sinlen = sizeof(sin);
fd = accept(httpfd, (struct sockaddr *)&sin, &sinlen); fd = accept(httpfd, (struct sockaddr *)&sin, &sinlen);
@ -503,25 +505,28 @@ static void *http_root(void *data)
continue; continue;
} }
ser = ast_calloc(1, sizeof(*ser)); ser = ast_calloc(1, sizeof(*ser));
if (ser) { if (!ser) {
int flags = fcntl(fd, F_GETFL); ast_log(LOG_WARNING, "No memory for new session: %s\n", strerror(errno));
fcntl(fd, F_SETFL, flags & ~O_NONBLOCK); close(fd);
ser->fd = fd; continue;
memcpy(&ser->requestor, &sin, sizeof(ser->requestor)); }
if ((ser->f = fdopen(ser->fd, "w+"))) { flags = fcntl(fd, F_GETFL);
pthread_attr_init(&attr); fcntl(fd, F_SETFL, flags & ~O_NONBLOCK);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); ser->fd = fd;
memcpy(&ser->requestor, &sin, sizeof(ser->requestor));
if (ast_pthread_create_background(&launched, &attr, ast_httpd_helper_thread, ser)) { if ((ser->f = fdopen(ser->fd, "w+"))) {
ast_log(LOG_WARNING, "Unable to launch helper thread: %s\n", strerror(errno)); pthread_attr_init(&attr);
fclose(ser->f); pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
free(ser);
} if (ast_pthread_create_background(&launched, &attr, ast_httpd_helper_thread, ser)) {
} else { ast_log(LOG_WARNING, "Unable to launch helper thread: %s\n", strerror(errno));
ast_log(LOG_WARNING, "fdopen failed!\n"); fclose(ser->f);
close(ser->fd);
free(ser); free(ser);
} }
} else {
ast_log(LOG_WARNING, "fdopen failed!\n");
close(ser->fd);
free(ser);
} }
} }
return NULL; return NULL;

Loading…
Cancel
Save