Back Midas Rome Roody Rootana
  Midas DAQ System  Not logged in ELOG logo
Message ID: 937     Entry time: 14 Nov 2013
Author: Konstantin Olchanski 
Topic: Bug Report 
Subject: MacOS10.9 strlcpy() problem 
On MacOS 10.9 MIDAS will crashes in strlcpy() somewhere inside odb.c. We think this is because strlcpy() 
in MacOS 10.9 was changed to abort() if input and output strings overlap. For overlapping memory one is 
supposed to use memmove(). This is fixed in current midas, for older versions, you can try this patch:

konstantin-olchanskis-macbook:midas olchansk$ git diff
diff --git a/src/odb.c b/src/odb.c
index 1589dfa..762e2ed 100755
--- a/src/odb.c
+++ b/src/odb.c
@@ -6122,7 +6122,10 @@ INT db_paste(HNDLE hDB, HNDLE hKeyRoot, const char *buffer)
                while ((*pc == ' ' || *pc == ':') && *pc)
-               strlcpy(data_str, pc, sizeof(data_str));
+               //strlcpy(data_str, pc, sizeof(data_str)); // MacOS 10.9 does not permit strlcpy() of overlapping 
+               assert(strlen(pc) < sizeof(data_str)); // "pc" points at a substring inside "data_str"
+               memmove(data_str, pc, strlen(pc)+1);
                if (n_data > 1) {
                   data_str[0] = 0;
konstantin-olchanskis-macbook:midas olchansk$ 

As historical reference:

a) MacOS documentation says "behavior is undefined", which is no longer true, the behaviour is KABOOM!

b) the original strlcpy paper from OpenBSD does not contain the word "overlap"

c) the OpenBSD man page says the same as Apple man page (behaviour undefined)

d) the linux kernel strlcpy() uses memcpy() and is probably unsafe for overlapping strings

e) midas strlcpy() looks to be safe for overlapping strings.

ELOG V3.1.4-2e1708b5