[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: how to check for binary compability?



Hey,

First thanks for your very valuable answers, they helped me a lot.

On 25/05/2009 Russ Allbery wrote:
> Jonas Meurer <jonas@freesources.org> writes:
> 
> > At packaging mimelib1 from standalone-source I patched the sources to
> > use strncpy/strncat instead of strlcpy/strlcpy along with several
> > other changes.
> >
> > Now I tried to check for binary compability with libmimelib1c2a packages
> > from kdepim 3.5.9 sources. To do that, I compared the output of
> > 'objdump -T /usr/lib/libmimelib.so.1 | grep \\.text | cut -b62-'
> >
> > Unfortunately there are differences. Now I simply don't know if these
> > differences render the package binary incompatible, or whether they
> > don't matter at all.
> 
> Additions do not break binary compatibility in shared libraries, so the
> only concern is with the removals:

does this mean that symbol additions can be simply ignored? or is
something like a symbols file required?

> > -strlcpy
> > -mkstemps
> > -strlcat

these ones clearly come from kdelibs-3.5.10.dfsg.1/kdecore/fakes.c, which
was included in mimelib 1.1.2 from kdepim-3.5.9 in order to provide
strlcat and strlcpy.

> > -_ZN8DwStringixEm

i don't understand that one at all. I cannot find anything with the
string 'ZN8DwStringixEm' in either kdepim or kdelibs sources.

> The new version of the library is no longer exporting its internal
> portability functions.  This is good -- libraries should not export
> unrelated symbols.  However, if any of its dependencies happened to
> depend on those internal symbols (using the versions provided by the
> library lazily rather than providing their own), you would break them.

lurker is the only package that depends on mimelib1 in debian, and that
one clearly doesn't use private symbols from mimelib1. We cannot know
about custom software though.

> I don't have a good feel for how likely that is for this particular
> library.  In general, removal of internal symbols that were never part
> of the public API is often done without a bump in the SONAME and just
> fixing any dependent packages that break, but ideally it's nice to know
> what might break.  Debian Developers with access to the Lintian lab on
> gluck can search through the objdump output for clues, although we don't
> have a simple script to do that.  I'm not sure what to recommend to
> people who don't have access to a fully populated Lintian lab.
> 
> More concerning is the last symbol removal, which indicates that the
> library has removed:
> 
>     DwString::operator[](unsigned long)
> 
> which was present in the previous version.  Is this also an internal
> symbol or was it part of the published API?

to be honest, I don't know. at least it is not been used in lurker. I
don't even understand which change caused the symbol to disappear.
DwString::operator is defined in mimelib/mimelib/string.h, and no change
was made to that header file at all.

I attached the diff from kdepim-3.5.9/mimelib sources to mimelib 1.1.2
standalone sources (without documentation changes).

greetings,
 jonas
diff -rNu ../other/kdepim3/kdepim-3.5.9/mimelib/Makefile.am mimelib1-1.1.2/mimelib/Makefile.am
--- ../other/kdepim3/kdepim-3.5.9/mimelib/Makefile.am	2005-09-10 10:24:49.000000000 +0200
+++ mimelib1-1.1.2/mimelib/Makefile.am	2009-04-27 17:11:08.000000000 +0200
@@ -57,7 +57,7 @@
     uuencode.cpp \
     binhex.cpp
 
-libmimelib_la_LDFLAGS = -L$(kde_libraries) -lkdefakes -version-info 1:1 -no-undefined
+libmimelib_la_LDFLAGS = -version-info 1:1
 
 check_PROGRAMS = test_boyermor
 
diff -rNu ../other/kdepim3/kdepim-3.5.9/mimelib/mimelib/config.h mimelib1-1.1.2/mimelib/mimelib/config.h
--- ../other/kdepim3/kdepim-3.5.9/mimelib/mimelib/config.h	2007-05-14 09:54:54.000000000 +0200
+++ mimelib1-1.1.2/mimelib/mimelib/config.h	2009-04-27 18:04:46.000000000 +0200
@@ -123,8 +123,7 @@
 #      define DW_EXPORT __declspec(dllimport)
 #   endif
 #else
-#   include <kdepimmacros.h>
-#   define DW_EXPORT KDE_EXPORT
+#   define DW_EXPORT
 #endif
 
 //-----------------------------------------------------------------------------
diff -rNu ../other/kdepim3/kdepim-3.5.9/mimelib/nntp.cpp mimelib1-1.1.2/mimelib/nntp.cpp
--- ../other/kdepim3/kdepim-3.5.9/mimelib/nntp.cpp	2007-05-14 09:54:54.000000000 +0200
+++ mimelib1-1.1.2/mimelib/nntp.cpp	2009-04-27 18:17:31.000000000 +0200
@@ -113,7 +113,7 @@
         snprintf(mSendBuffer, SEND_BUFFER_SIZE, "ARTICLE %d\r\n", aArticleNum);
     }
     else {
-        strlcpy(mSendBuffer, "ARTICLE\r\n", SEND_BUFFER_SIZE);
+        strcpy(mSendBuffer, "ARTICLE\r\n");
     }
     DBG_NNTP_STMT(cout << "C: " << mSendBuffer << flush;)
     int bufferLen = strlen(mSendBuffer);
@@ -137,9 +137,9 @@
         // error!
         return mReplyCode;
     }
-    strlcpy(mSendBuffer, "ARTICLE ", SEND_BUFFER_SIZE);
-    strlcat(mSendBuffer, aMsgId, SEND_BUFFER_SIZE);
-    strlcat(mSendBuffer, "\r\n", SEND_BUFFER_SIZE);
+    strcpy(mSendBuffer, "ARTICLE ");
+    strncat(mSendBuffer, aMsgId, 80);
+    strcat(mSendBuffer, "\r\n");
     DBG_NNTP_STMT(cout << "C: " << mSendBuffer << flush;)
     int bufferLen = strlen(mSendBuffer);
     int numSent = PSend(mSendBuffer, bufferLen);
@@ -162,7 +162,7 @@
         snprintf(mSendBuffer, SEND_BUFFER_SIZE, "HEAD %d\r\n", aArticleNum);
     }
     else {
-        strlcpy(mSendBuffer, "HEAD\r\n", SEND_BUFFER_SIZE);
+        strcpy(mSendBuffer, "HEAD\r\n");
     }
     DBG_NNTP_STMT(cout << "C: " << mSendBuffer << flush;)
     int bufferLen = strlen(mSendBuffer);
@@ -185,9 +185,9 @@
     if (!aMsgId || !*aMsgId) {
         return mReplyCode;
     }
-    strlcpy(mSendBuffer, "HEAD ", SEND_BUFFER_SIZE);
-    strlcat(mSendBuffer, aMsgId, SEND_BUFFER_SIZE);
-    strlcat(mSendBuffer, "\r\n", SEND_BUFFER_SIZE);
+    strcpy(mSendBuffer, "HEAD ");
+    strncat(mSendBuffer, aMsgId, 80);
+    strcat(mSendBuffer, "\r\n");
     DBG_NNTP_STMT(cout << "C: " << mSendBuffer << flush;)
     int bufferLen = strlen(mSendBuffer);
     int numSent = PSend(mSendBuffer, bufferLen);
@@ -210,7 +210,7 @@
         snprintf(mSendBuffer, SEND_BUFFER_SIZE, "BODY %d\r\n", articleNum);
     }
     else {
-        strlcpy(mSendBuffer, "BODY\r\n", SEND_BUFFER_SIZE);
+        strcpy(mSendBuffer, "BODY\r\n");
     }
     DBG_NNTP_STMT(cout << "C: " << mSendBuffer << flush;)
     int bufferLen = strlen(mSendBuffer);
@@ -233,9 +233,9 @@
     if (!aMsgId || !*aMsgId) {
         return mReplyCode;
     }
-    strlcpy(mSendBuffer, "BODY ", SEND_BUFFER_SIZE);
-    strlcat(mSendBuffer, aMsgId, SEND_BUFFER_SIZE);
-    strlcat(mSendBuffer, "\r\n", SEND_BUFFER_SIZE);
+    strcpy(mSendBuffer, "BODY ");
+    strncat(mSendBuffer, aMsgId, 80);
+    strcat(mSendBuffer, "\r\n");
     DBG_NNTP_STMT(cout << "C: " << mSendBuffer << flush;)
     int bufferLen = strlen(mSendBuffer);
     int numSent = PSend(mSendBuffer, bufferLen);
@@ -258,7 +258,7 @@
         snprintf(mSendBuffer, SEND_BUFFER_SIZE, "STAT %d\r\n", articleNum);
     }
     else {
-        strlcpy(mSendBuffer, "STAT\r\n", SEND_BUFFER_SIZE);
+        strcpy(mSendBuffer, "STAT\r\n");
     }
     DBG_NNTP_STMT(cout << "C: " << mSendBuffer << flush;)
     int bufferLen = strlen(mSendBuffer);
@@ -278,9 +278,9 @@
     if (!aMsgId || !*aMsgId) {
         return mReplyCode;
     }
-    strlcpy(mSendBuffer, "STAT ", SEND_BUFFER_SIZE);
-    strlcat(mSendBuffer, aMsgId, SEND_BUFFER_SIZE);
-    strlcat(mSendBuffer, "\r\n", SEND_BUFFER_SIZE);
+    strcpy(mSendBuffer, "STAT ");
+    strncat(mSendBuffer, aMsgId, 80);
+    strcat(mSendBuffer, "\r\n");
     DBG_NNTP_STMT(cout << "C: " << mSendBuffer << flush;)
     int bufferLen = strlen(mSendBuffer);
     int numSent = PSend(mSendBuffer, bufferLen);
@@ -299,9 +299,9 @@
     if (!aNewsgroupName || !*aNewsgroupName) {
         return mReplyCode;
     }
-    strlcpy(mSendBuffer, "GROUP ", SEND_BUFFER_SIZE);
-    strlcat(mSendBuffer, aNewsgroupName, SEND_BUFFER_SIZE);
-    strlcat(mSendBuffer, "\r\n", SEND_BUFFER_SIZE);
+    strcpy(mSendBuffer, "GROUP ");
+    strncat(mSendBuffer, aNewsgroupName, SEND_BUFFER_SIZE-32);
+    strcat(mSendBuffer, "\r\n");
     DBG_NNTP_STMT(cout << "C: " << mSendBuffer << flush;)
     int bufferLen = strlen(mSendBuffer);
     int numSent = PSend(mSendBuffer, bufferLen);
@@ -317,7 +317,7 @@
     mReplyCode = 0;
     mStatusResponse = mTextResponse = "";
     mLastCommand = kCmdHelp;
-    strlcpy(mSendBuffer, "HELP\r\n", SEND_BUFFER_SIZE);
+    strcpy(mSendBuffer, "HELP\r\n");
     DBG_NNTP_STMT(cout << "C: " << mSendBuffer << flush;)
     int bufferLen = strlen(mSendBuffer);
     int numSent = PSend(mSendBuffer, bufferLen);
@@ -336,7 +336,7 @@
     mReplyCode = 0;
     mStatusResponse = mTextResponse = "";
     mLastCommand = kCmdLast;
-    strlcpy(mSendBuffer, "LAST\r\n", SEND_BUFFER_SIZE);
+    strcpy(mSendBuffer, "LAST\r\n");
     DBG_NNTP_STMT(cout << "C: " << mSendBuffer << flush;)
     int bufferLen = strlen(mSendBuffer);
     int numSent = PSend(mSendBuffer, bufferLen);
@@ -352,7 +352,7 @@
     mReplyCode = 0;
     mStatusResponse = mTextResponse = "";
     mLastCommand = kCmdList;
-    strlcpy(mSendBuffer, "LIST\r\n", SEND_BUFFER_SIZE);
+    strcpy(mSendBuffer, "LIST\r\n");
     DBG_NNTP_STMT(cout << "C: " << mSendBuffer << flush;)
     int bufferLen = strlen(mSendBuffer);
     int numSent = PSend(mSendBuffer, bufferLen);
@@ -372,18 +372,18 @@
     mReplyCode = 0;
     mStatusResponse = mTextResponse = "";
     mLastCommand = kCmdNewgroups;
-    strlcpy(mSendBuffer, "NEWGROUPS ", SEND_BUFFER_SIZE);
-    strlcat(mSendBuffer, aDate, SEND_BUFFER_SIZE);
-    strlcat(mSendBuffer, " ", SEND_BUFFER_SIZE);
-    strlcat(mSendBuffer, aTime, SEND_BUFFER_SIZE);
+    strcpy(mSendBuffer, "NEWGROUPS ");
+    strncat(mSendBuffer, aDate, 16);
+    strcat(mSendBuffer, " ");
+    strncat(mSendBuffer, aTime, 16);
     if (aIsGmt) {
-        strlcat(mSendBuffer, " GMT", SEND_BUFFER_SIZE);
+        strcat(mSendBuffer, " GMT");
     }
     if (aDistribution) {
-        strlcat(mSendBuffer, " ", SEND_BUFFER_SIZE);
-        strlcat(mSendBuffer, aDistribution, SEND_BUFFER_SIZE);
+        strcat(mSendBuffer, " ");
+        strncat(mSendBuffer, aDistribution, SEND_BUFFER_SIZE-64);
     }
-    strlcat(mSendBuffer, "\r\n", SEND_BUFFER_SIZE);
+    strcat(mSendBuffer, "\r\n");
     DBG_NNTP_STMT(cout << "C: " << mSendBuffer << flush;)
     int bufferLen = strlen(mSendBuffer);
     int numSent = PSend(mSendBuffer, bufferLen);
@@ -403,20 +403,21 @@
     mReplyCode = 0;
     mStatusResponse = mTextResponse = "";
     mLastCommand = kCmdNewnews;
-    strlcpy(mSendBuffer, "NEWNEWS ", SEND_BUFFER_SIZE);
-    strlcat(mSendBuffer, aNewsgroups, SEND_BUFFER_SIZE);
-    strlcat(mSendBuffer, " ", SEND_BUFFER_SIZE);
-    strlcat(mSendBuffer, aDate, SEND_BUFFER_SIZE);
-    strlcat(mSendBuffer, " ", SEND_BUFFER_SIZE);
-    strlcat(mSendBuffer, aTime, SEND_BUFFER_SIZE);
+    strcpy(mSendBuffer, "NEWNEWS ");
+    strncat(mSendBuffer, aNewsgroups, SEND_BUFFER_SIZE-64);
+    strcat(mSendBuffer, " ");
+    strncat(mSendBuffer, aDate, 16);
+    strcat(mSendBuffer, " ");
+    strncat(mSendBuffer, aTime, 16);
     if (aIsGmt) {
-        strlcat(mSendBuffer, " GMT", SEND_BUFFER_SIZE);
+        strcat(mSendBuffer, " GMT");
     }
     if (aDistribution) {
-        strlcat(mSendBuffer, " ", SEND_BUFFER_SIZE);
-        strlcat(mSendBuffer, aDistribution, SEND_BUFFER_SIZE);
+        strcat(mSendBuffer, " ");
+        size_t n = strlen(mSendBuffer);
+        strncat(mSendBuffer, aDistribution, SEND_BUFFER_SIZE-n-4);
     }
-    strlcat(mSendBuffer, "\r\n", SEND_BUFFER_SIZE);
+    strcat(mSendBuffer, "\r\n");
     DBG_NNTP_STMT(cout << "C: " << mSendBuffer << flush;)
     int bufferLen = strlen(mSendBuffer);
     int numSent = PSend(mSendBuffer, bufferLen);
@@ -435,7 +436,7 @@
     mReplyCode = 0;
     mStatusResponse = mTextResponse = "";
     mLastCommand = kCmdNext;
-    strlcpy(mSendBuffer, "NEXT\r\n", SEND_BUFFER_SIZE);
+    strcpy(mSendBuffer, "NEXT\r\n");
     DBG_NNTP_STMT(cout << "C: " << mSendBuffer << flush;)
     int bufferLen = strlen(mSendBuffer);
     int numSent = PSend(mSendBuffer, bufferLen);
@@ -451,7 +452,7 @@
     mReplyCode = 0;
     mStatusResponse = mTextResponse = "";
     mLastCommand = kCmdPost;
-    strlcpy(mSendBuffer, "POST\r\n", SEND_BUFFER_SIZE);
+    strcpy(mSendBuffer, "POST\r\n");
     DBG_NNTP_STMT(cout << "C: " << mSendBuffer << flush;)
     int bufferLen = strlen(mSendBuffer);
     int numSent = PSend(mSendBuffer, bufferLen);
@@ -467,7 +468,7 @@
     mReplyCode = 0;
     mStatusResponse = mTextResponse = "";
     mLastCommand = kCmdQuit;
-    strlcpy(mSendBuffer, "QUIT\r\n", SEND_BUFFER_SIZE);
+    strcpy(mSendBuffer, "QUIT\r\n");
     DBG_NNTP_STMT(cout << "C: " << mSendBuffer << flush;)
     int bufferLen = strlen(mSendBuffer);
     int numSent = PSend(mSendBuffer, bufferLen);
@@ -483,7 +484,7 @@
     mReplyCode = 0;
     mStatusResponse = mTextResponse = "";
     mLastCommand = kCmdSlave;
-    strlcpy(mSendBuffer, "SLAVE\r\n", SEND_BUFFER_SIZE);
+    strcpy(mSendBuffer, "SLAVE\r\n");
     DBG_NNTP_STMT(cout << "C: " << mSendBuffer << flush;)
     int bufferLen = strlen(mSendBuffer);
     int numSent = PSend(mSendBuffer, bufferLen);
diff -rNu ../other/kdepim3/kdepim-3.5.9/mimelib/pop.cpp mimelib1-1.1.2/mimelib/pop.cpp
--- ../other/kdepim3/kdepim-3.5.9/mimelib/pop.cpp	2007-05-14 09:54:54.000000000 +0200
+++ mimelib1-1.1.2/mimelib/pop.cpp	2009-04-27 18:15:35.000000000 +0200
@@ -107,9 +107,9 @@
     mStatusCode = 0;
     mSingleLineResponse = mMultiLineResponse = "";
     mLastCommand = kCmdUser;
-    strlcpy(mSendBuffer, "USER ", SEND_BUFFER_SIZE);
-    strlcat(mSendBuffer, aName, SEND_BUFFER_SIZE);
-    strlcat(mSendBuffer, "\r\n", SEND_BUFFER_SIZE);
+    strcpy(mSendBuffer, "USER ");
+    strncat(mSendBuffer, aName, SEND_BUFFER_SIZE-32);
+    strcat(mSendBuffer, "\r\n");
     DBG_POP_STMT(cout << "C: " << mSendBuffer << flush;)
     int bufferLen = strlen(mSendBuffer);
     int numSent = PSend(mSendBuffer, bufferLen);
@@ -125,9 +125,9 @@
     mStatusCode = 0;
     mSingleLineResponse = mMultiLineResponse = "";
     mLastCommand = kCmdPass;
-    strlcpy(mSendBuffer, "PASS ", SEND_BUFFER_SIZE);
-    strlcat(mSendBuffer, aPasswd, SEND_BUFFER_SIZE);
-    strlcat(mSendBuffer, "\r\n", SEND_BUFFER_SIZE);
+    strcpy(mSendBuffer, "PASS ");
+    strncat(mSendBuffer, aPasswd, SEND_BUFFER_SIZE-32);
+    strcat(mSendBuffer, "\r\n");
     DBG_POP_STMT(cout << "C: " << mSendBuffer << flush;)
     int bufferLen = strlen(mSendBuffer);
     int numSent = PSend(mSendBuffer, bufferLen);
@@ -143,7 +143,7 @@
     mStatusCode = 0;
     mSingleLineResponse = mMultiLineResponse = "";
     mLastCommand = kCmdQuit;
-    strlcpy(mSendBuffer, "QUIT\r\n", SEND_BUFFER_SIZE);
+    strcpy(mSendBuffer, "QUIT\r\n");
     DBG_POP_STMT(cout << "C: " << mSendBuffer << flush;)
     int bufferLen = strlen(mSendBuffer);
     int numSent = PSend(mSendBuffer, bufferLen);
@@ -159,7 +159,7 @@
     mStatusCode = 0;
     mSingleLineResponse = mMultiLineResponse = "";
     mLastCommand = kCmdStat;
-    strlcpy(mSendBuffer, "STAT\r\n", SEND_BUFFER_SIZE);
+    strcpy(mSendBuffer, "STAT\r\n");
     DBG_POP_STMT(cout << "C: " << mSendBuffer << flush;)
     int bufferLen = strlen(mSendBuffer);
     int numSent = PSend(mSendBuffer, bufferLen);
@@ -175,7 +175,7 @@
     mStatusCode = 0;
     mSingleLineResponse = mMultiLineResponse = "";
     mLastCommand = kCmdList;
-    strlcpy(mSendBuffer, "LIST\r\n", SEND_BUFFER_SIZE);
+    strcpy(mSendBuffer, "LIST\r\n");
     DBG_POP_STMT(cout << "C: " << mSendBuffer << flush;)
     int bufferLen = strlen(mSendBuffer);
     int numSent = PSend(mSendBuffer, bufferLen);
@@ -245,7 +245,7 @@
     mStatusCode = 0;
     mSingleLineResponse = mMultiLineResponse = "";
     mLastCommand = kCmdNoop;
-    strlcpy(mSendBuffer, "NOOP\r\n", SEND_BUFFER_SIZE);
+    strcpy(mSendBuffer, "NOOP\r\n");
     DBG_POP_STMT(cout << "C: " << mSendBuffer << flush;)
     int bufferLen = strlen(mSendBuffer);
     int numSent = PSend(mSendBuffer, bufferLen);
@@ -261,7 +261,7 @@
     mStatusCode = 0;
     mSingleLineResponse = mMultiLineResponse = "";
     mLastCommand = kCmdRset;
-    strlcpy(mSendBuffer, "RSET\r\n", SEND_BUFFER_SIZE);
+    strcpy(mSendBuffer, "RSET\r\n");
     DBG_POP_STMT(cout << "C: " << mSendBuffer << flush;)
     int bufferLen = strlen(mSendBuffer);
     int numSent = PSend(mSendBuffer, bufferLen);
@@ -277,7 +277,7 @@
     mStatusCode = 0;
     mSingleLineResponse = mMultiLineResponse = "";
     mLastCommand = kCmdRset;
-    strlcpy(mSendBuffer, "LAST\r\n", SEND_BUFFER_SIZE);
+    strcpy(mSendBuffer, "LAST\r\n");
     DBG_POP_STMT(cout << "C: " << mSendBuffer << flush;)
     int bufferLen = strlen(mSendBuffer);
     int numSent = PSend(mSendBuffer, bufferLen);
@@ -293,11 +293,11 @@
     mStatusCode = 0;
     mSingleLineResponse = mMultiLineResponse = "";
     mLastCommand = kCmdApop;
-    strlcpy(mSendBuffer, "APOP ", SEND_BUFFER_SIZE);
-    strlcat(mSendBuffer, aName, SEND_BUFFER_SIZE);
-    strlcat(mSendBuffer, " ", SEND_BUFFER_SIZE);
-    strlcat(mSendBuffer, aDigest, SEND_BUFFER_SIZE);
-    strlcat(mSendBuffer, "\r\n", SEND_BUFFER_SIZE);
+    strcpy(mSendBuffer, "APOP ");
+    strncat(mSendBuffer, aName, 256);
+    strcat(mSendBuffer, " ");
+    strncat(mSendBuffer, aDigest, 256);
+    strcat(mSendBuffer, "\r\n");
     DBG_POP_STMT(cout << "C: " << mSendBuffer << flush;)
     int bufferLen = strlen(mSendBuffer);
     int numSent = PSend(mSendBuffer, bufferLen);
@@ -332,7 +332,7 @@
     mStatusCode = 0;
     mSingleLineResponse = mMultiLineResponse = "";
     mLastCommand = kCmdUidl;
-    strlcpy(mSendBuffer, "UIDL\r\n", SEND_BUFFER_SIZE);
+    strcpy(mSendBuffer, "UIDL\r\n");
     DBG_POP_STMT(cout << "C: " << mSendBuffer << flush;)
     int bufferLen = strlen(mSendBuffer);
     int numSent = PSend(mSendBuffer, bufferLen);
diff -rNu ../other/kdepim3/kdepim-3.5.9/mimelib/uuencode.cpp mimelib1-1.1.2/mimelib/uuencode.cpp
--- ../other/kdepim3/kdepim-3.5.9/mimelib/uuencode.cpp	2007-05-14 09:54:54.000000000 +0200
+++ mimelib1-1.1.2/mimelib/uuencode.cpp	2009-04-27 18:12:31.000000000 +0200
@@ -53,7 +53,7 @@
 void DwUuencode::SetFileName(const char* aName)
 {
     size_t n = sizeof(mFileName);
-    strlcpy(mFileName, aName, n);
+    strncpy(mFileName, aName, n);
     mFileName[n-1] = 0; // Superfluous
 }
 

Reply to: