On Fri, Nov 30, 2012 at 7:01 PM, Mans Rullgard <mans.rullg...@linaro.org> wrote:
> On 30 November 2012 10:39, Ajeet Yadav <ajeet.yadav...@gmail.com> wrote:
>> Linux version 3.0.33 (Cortex A15)
>> Below program crashes with 2.14.1 glibc but runs fine with 2.11.1 glibc.
>>
>> #include <pthread.h>
>> #include <stdio.h>
>> #include <stdlib.h>
>> #include <signal.h>
>> #include <string.h>
>> #include <errno.h>
>>
>> #define MAX_LINE_SIZE 80
>>
>> #define MAX_THREAD 20
>> #define MAX_POPEN 10
>> #define MALLOC_SIZE 16
>>
>> void* pipe_thread(void *arg)
>> {
>>     int i;
>>     char *p = NULL;
>>     FILE *fp[MAX_POPEN];
>>     char shellCommand[MAX_LINE_SIZE];
>>
>>     memset(shellCommand, 0x00, MAX_LINE_SIZE);
>>     sprintf(shellCommand, "mount");
>>     signal(SIGPIPE, SIG_IGN);
>>
>>     while (1) {
>>         for (i = 0; i < MAX_POPEN; ++i) {
>>             fp[i] = popen(shellCommand, "r");
>>         }
>>
>>         if (p) {
>>             free(p);
>>         }
>>
>>         for (i = 0; i < MAX_POPEN; ++i) {
>>             if (fp[i])
>>                 pclose(fp[i]);
>>         }
>>
>>         p = malloc(MALLOC_SIZE);
>>         if (p)
>>             memset(p, 0, MALLOC_SIZE);
>>     }
>>     return NULL;
>> }
>>
>> int main(int argc, char *argv[])
>> {
>>     int i;
>>     pthread_t tid;
>>
>>     for (i = 0; i < MAX_THREAD; ++i) {
>>         pthread_create(&tid, NULL, &pipe_thread, (void*)NULL);
>>     }
>>     sleep(60);
>> }
>
> On returning from main(), all open streams are closed, but your threads are
> still running and might call pclose() on an already closed FILE, which is
> not allowed.
>
> --
> Mans Rullgard / mru
At first thank you for feedback, About code, their is sleep of 1
minutes, but I found that most of the time the code crashes before 1
minute is passed.
More important, is that this problem never occur on 2.11.1 glibc.
Yesturday I have been able to fix this issue with below patch, now
this problem no longer occurs.
But still my interest is 1> Why this patch fixes the problem ? 2> What
change between 2.11.1 and 2.14.1 caused this problem
-------------------------------------------------------------------------------
diff --git a/libio/iopopen.c b/libio/iopopen.c
index 1a5cc0f..888a57f 100644
--- a/libio/iopopen.c
+++ b/libio/iopopen.c
@@ -299,6 +299,7 @@ _IO_new_popen (command, mode)
   new_f = (struct locked_FILE *) malloc (sizeof (struct locked_FILE));
   if (new_f == NULL)
     return NULL;
+  memset(new_f, 0, sizeof (struct locked_FILE));
 #ifdef _IO_MTSAFE_IO
   new_f->fpx.file.file._lock = &new_f->lock;
 #endif
--------------------------------------------------------------------------------------------

_______________________________________________
linaro-toolchain mailing list
linaro-toolchain@lists.linaro.org
http://lists.linaro.org/mailman/listinfo/linaro-toolchain

Reply via email to