Changeset: 9fbe22cfdaf8 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=9fbe22cfdaf8
Modified Files:
        gdk/gdk_bbp.c
        gdk/gdk_system.c
        gdk/gdk_system.h
        monetdb5/mal/mal_instruction.c
        monetdb5/modules/mal/mal_mapi.c
Branch: Apr2019
Log Message:

Fixed some GCC warnings from strncpy usages.

Don't use strncpy without checking if the size of the destination buffer is 
large enough for the source string plus the null character.


diffs (138 lines):

diff --git a/gdk/gdk_bbp.c b/gdk/gdk_bbp.c
--- a/gdk/gdk_bbp.c
+++ b/gdk/gdk_bbp.c
@@ -2836,6 +2836,7 @@ BBPbackup(BAT *b, bool subcommit)
        char *srcdir;
        long_str nme;
        const char *s = BBP_physical(b->batCacheid);
+       size_t slen;
 
        if (BBPprepare(subcommit) != GDK_SUCCEED) {
                return GDK_FAIL;
@@ -2849,8 +2850,11 @@ BBPbackup(BAT *b, bool subcommit)
        s = strrchr(srcdir, DIR_SEP);
        if (!s)
                goto fail;
-       strncpy(nme, ++s, sizeof(nme));
-       nme[sizeof(nme) - 1] = 0;
+
+       slen = strlen(s);
+       if (slen >= sizeof(nme))
+               goto fail;
+       memcpy(nme, ++s, slen + 1);
        srcdir[s - srcdir] = 0;
 
        if (b->ttype != TYPE_void &&
diff --git a/gdk/gdk_system.c b/gdk/gdk_system.c
--- a/gdk/gdk_system.c
+++ b/gdk/gdk_system.c
@@ -713,8 +713,13 @@ MT_create_thread(MT_Id *t, void (*f) (vo
        pthread_attr_t attr;
        int ret;
        struct posthread *p;
+       size_t tlen;
 
        join_threads();
+       if (!threadname) {
+               fprintf(stderr, "#MT_create_thread: thread must have a name\n");
+               return -1;
+       }
        if ((ret = pthread_attr_init(&attr)) != 0) {
                fprintf(stderr,
                        "#MT_create_thread: cannot init pthread attr: %s\n",
@@ -743,8 +748,15 @@ MT_create_thread(MT_Id *t, void (*f) (vo
                .detached = (d == MT_THR_DETACHED),
        };
        ATOMIC_INIT(&p->exited, 0);
-       strncpy(p->threadname, threadname, sizeof(p->threadname));
-       p->threadname[sizeof(p->threadname) - 1] = 0;
+
+       tlen = strlen(threadname);
+       if (tlen >= sizeof(p->threadname)) {
+               fprintf(stderr, "#MT_create_thread: thread's name is too 
large\n");
+               pthread_attr_destroy(&attr);
+               free(p);
+               return -1;
+       }
+       memcpy(p->threadname, threadname, tlen + 1);
        pthread_mutex_lock(&posthread_lock);
        p->next = posthreads;
        posthreads = p;
diff --git a/gdk/gdk_system.h b/gdk/gdk_system.h
--- a/gdk/gdk_system.h
+++ b/gdk/gdk_system.h
@@ -458,9 +458,14 @@ typedef struct MT_Lock {
 
 #define MT_lock_init(l, n)                                     \
        do {                                                    \
+               size_t nlen; \
+               assert(n); \
                ATOMIC_CLEAR(&(l)->lock);                       \
-               strncpy((l)->name, (n), sizeof((l)->name));     \
-               (l)->name[sizeof((l)->name) - 1] = 0;           \
+               nlen = strlen(n); \
+               if (nlen >= sizeof((l)->name)) \
+                       nlen = sizeof((l)->name) - 1; \
+               memcpy((l)->name, (n), nlen + 1); \
+               (l)->name[sizeof((l)->name) - 1] = 0; \
                _DBG_LOCK_INIT(l);                              \
        } while (0)
 
diff --git a/monetdb5/mal/mal_instruction.c b/monetdb5/mal/mal_instruction.c
--- a/monetdb5/mal/mal_instruction.c
+++ b/monetdb5/mal/mal_instruction.c
@@ -385,14 +385,20 @@ getMalBlkOptimized(MalBlkPtr mb, str nam
        InstrPtr p;
        int i= 0;
        char buf[IDLENGTH]= {0}, *n;
+       size_t nlen;
 
        if( name == 0)
                return mb;
-       strncpy(buf,name, IDLENGTH);
-       buf[IDLENGTH - 1] = 0;
+
+       nlen = strlen(name);
+       if (nlen >= sizeof(buf)) {
+               mb->errors = createMalException(mb,0, TYPE, "Optimizer name is 
too large");
+               return NULL;
+       }
+       memcpy(buf, name, nlen + 1);
        n = strchr(buf,']');
        if( n) *n = 0;
-       
+
        while (h ){
                for( i = 1; i< h->stop; i++){
                        p = getInstrPtr(h,i);
diff --git a/monetdb5/modules/mal/mal_mapi.c b/monetdb5/modules/mal/mal_mapi.c
--- a/monetdb5/modules/mal/mal_mapi.c
+++ b/monetdb5/modules/mal/mal_mapi.c
@@ -561,6 +561,7 @@ SERVERlisten(int port, const char *usock
        int on = 1;
        int i = 0;
        MT_Id pid;
+       size_t ulen;
 #ifdef DEBUG_SERVER
        char msg[512], host[512];
        Client cntxt= mal_clients;
@@ -745,9 +746,16 @@ SERVERlisten(int port, const char *usock
 #endif
 
                userver.sun_family = AF_UNIX;
-               strncpy(userver.sun_path, usockfile, sizeof(userver.sun_path));
-               userver.sun_path[sizeof(userver.sun_path) - 1] = 0;
-
+               ulen = strlen(usockfile);
+               if (ulen >= sizeof(userver.sun_path)) {
+                       char *e = createException(IO, "mal_mapi.listen", 
"usockfile name is too large");
+                       if (sock != INVALID_SOCKET)
+                               closesocket(sock);
+                       closesocket(usock);
+                       GDKfree(psock);
+                       return e;
+               }
+               memcpy(userver.sun_path, usockfile, ulen + 1);
                length = (SOCKLEN) sizeof(userver);
                if(remove(usockfile) == -1 && errno != ENOENT) {
                        char *e = createException(IO, "mal_mapi.listen", 
OPERATION_FAILED ": remove UNIX socket file");
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to