Added processing of null pointers in PackArguments (String argument)
authorDmitry Kovalenko <d.kovalenko@samsung.com>
Fri, 29 Jun 2012 06:23:14 +0000 (10:23 +0400)
committerDmitry Kovalenko <d.kovalenko@samsung.com>
Fri, 29 Jun 2012 06:23:14 +0000 (10:23 +0400)
driver/events.h

index 030b391..ac32279 100644 (file)
@@ -143,32 +143,40 @@ static char *PackArguments (char *pBuffer, unsigned long nLen, const char *szFor
                        }
                        break;
                case AT_STRING:
-                       {
-                               const char *s = va_arg (args, const char *);
-                               int nLengthOfString = 0, nSizeOfString;
+               {
+                       const char *s = va_arg (args, const char *);
+                       int nLengthOfString = 0, nSizeOfString;
+                       if(!s) {
+                               /* If string poiner is NULL then */
+                               s = "(null)";
+                       }
 #ifdef __KERNEL__
-                               if((void *)s < (void *)TASK_SIZE) {
-                                       nLengthOfString = strlen_user (s);
-                                       if(nFree < nLengthOfString)
-                                               return NULL; // no space for arg
-                                       if(strncpy_from_user(pResult, s, nLengthOfString) != (nLengthOfString-1))
-                                               EPRINTF ("failed to copy string from user %p, bytes %d", s, nLengthOfString);
+                       if((void *)s < (void *)TASK_SIZE) {
+                               nLengthOfString = strlen_user (s);
+                               if(nFree < nLengthOfString)
+                                       return NULL; // no space for arg
+                               if(strncpy_from_user(pResult,
+                                                    s,
+                                                    nLengthOfString) != (nLengthOfString-1)) {
+                                       EPRINTF("failed to copy string from user %p, bytes %d",
+                                               s, nLengthOfString);
                                }
-                               else
+                       }
+                       else
 #endif
-                               {
-                                       nLengthOfString = strlen (s) + 1;
-                                       if(nFree < nLengthOfString)
-                                               return NULL; // no space for arg
-                                       memcpy (pResult, s, nLengthOfString);
-                               }
-                               nSizeOfString = ALIGN_VALUE (nLengthOfString);
-                               if(nFree < nSizeOfString)
+                       {
+                               nLengthOfString = strlen (s) + 1;
+                               if(nFree < nLengthOfString)
                                        return NULL; // no space for arg
-                               pResult += nSizeOfString;
-                               nFree -= nSizeOfString;
+                               memcpy (pResult, s, nLengthOfString);
                        }
-                       break;
+                       nSizeOfString = ALIGN_VALUE (nLengthOfString);
+                       if(nFree < nSizeOfString)
+                               return NULL; // no space for arg
+                       pResult += nSizeOfString;
+                       nFree -= nSizeOfString;
+               }
+               break;
                case AT_ARRAY:
                        {
                                int nLength = va_arg (args, int);