OSDN Git Service

* exceptions.cc (open_stackdumpfile): Correctly append .stackdump
authorcorinna <corinna>
Tue, 1 Jun 2010 14:51:46 +0000 (14:51 +0000)
committercorinna <corinna>
Tue, 1 Jun 2010 14:51:46 +0000 (14:51 +0000)
suffix.

* nlsfuncs.cc (rebase_locale_buf): Reorder arguments.  Accommodate
throughout.  Add pointer to end of buffer and avoid changing pointers
not pointing into the buffer.

winsup/cygwin/ChangeLog
winsup/cygwin/exceptions.cc
winsup/cygwin/nlsfuncs.cc

index c0b4bf9..7bed49e 100644 (file)
@@ -1,5 +1,14 @@
 2010-06-01  Corinna Vinschen  <corinna@vinschen.de>
 
+       * exceptions.cc (open_stackdumpfile): Correctly append .stackdump
+       suffix.
+
+       * nlsfuncs.cc (rebase_locale_buf): Reorder arguments.  Accommodate
+       throughout.  Add pointer to end of buffer and avoid changing pointers
+       not pointing into the buffer.
+
+2010-06-01  Corinna Vinschen  <corinna@vinschen.de>
+
        * fhandler_netdrive.cc (fhandler_netdrive::exists): Always free WNet
        resource if created.
 
index 16a4e19..db60e67 100644 (file)
@@ -140,12 +140,11 @@ open_stackdumpfile ()
        p = myself->progname;
 
       WCHAR corefile[wcslen (p) + sizeof (".stackdump")];
-      wcscpy(corefile, p);
+      wcpcpy (wcpcpy(corefile, p), L".stackdump");
       UNICODE_STRING ucore;
       OBJECT_ATTRIBUTES attr;
       /* Create the UNICODE variation of <progname>.stackdump. */
       RtlInitUnicodeString (&ucore, corefile);
-      RtlAppendUnicodeToString (&ucore, L".stackdump");
       /* Create an object attribute which refers to <progname>.stackdump
         in Cygwin's cwd.  Stick to caseinsensitivity. */
       InitializeObjectAttributes (&attr, &ucore, OBJ_CASE_INSENSITIVE,
index e678147..e1adee4 100644 (file)
@@ -335,13 +335,13 @@ locale_cmp (const void *a, const void *b)
    arrays.  What we do here is just treat the lc_foo pointers as char ** and
    rebase all char * pointers within, up to the given size of the structure. */
 static void
-rebase_locale_buf (const void *ptrv, const char *newbase, const char *oldbase,
-                  const void *ptrvend)
+rebase_locale_buf (const void *ptrv, const void *ptrvend, const char *newbase,
+                  const char *oldbase, const char *oldend)
 {
-  const char **ptrs = (const char **) ptrv;
   const char **ptrsend = (const char **) ptrvend;
-  while (ptrs < ptrsend)
-    *ptrs++ += newbase - oldbase;
+  for (const char **ptrs = (const char **) ptrv; ptrs < ptrsend; ++ptrs)
+    if (*ptrs >= oldbase && *ptrs < oldend)
+      *ptrs += newbase - oldbase;
 }
 
 static wchar_t *
@@ -686,8 +686,8 @@ __set_lc_time_from_win (const char *name,
              else
                {
                  if (tmp != new_lc_time_buf)
-                   rebase_locale_buf (_time_locale, tmp, new_lc_time_buf,
-                                      _time_locale + 1);
+                   rebase_locale_buf (_time_locale, _time_locale + 1, tmp,
+                                      new_lc_time_buf, lc_time_ptr);
                  lc_time_ptr = tmp + (lc_time_ptr - new_lc_time_buf);
                  new_lc_time_buf = tmp;
                  lc_time_end = new_lc_time_buf + len;
@@ -748,8 +748,8 @@ __set_lc_time_from_win (const char *name,
       return -1;
     }
   if (tmp != new_lc_time_buf)
-    rebase_locale_buf (_time_locale, tmp, new_lc_time_buf,
-                      _time_locale + 1);
+    rebase_locale_buf (_time_locale, _time_locale + 1, tmp,
+                      new_lc_time_buf, lc_time_ptr);
   if (*lc_time_buf)
     free (*lc_time_buf);
   *lc_time_buf = tmp;
@@ -823,8 +823,8 @@ __set_lc_ctype_from_win (const char *name,
       return -1;
     }
   if (tmp != new_lc_ctype_buf)
-    rebase_locale_buf (_ctype_locale, tmp, new_lc_ctype_buf,
-                      _ctype_locale + 1);
+    rebase_locale_buf (_ctype_locale, _ctype_locale + 1, tmp,
+                      new_lc_ctype_buf, lc_ctype_ptr);
   if (*lc_ctype_buf)
     free (*lc_ctype_buf);
   *lc_ctype_buf = tmp;
@@ -883,8 +883,8 @@ __set_lc_numeric_from_win (const char *name,
       return -1;
     }
   if (tmp != new_lc_numeric_buf)
-    rebase_locale_buf (_numeric_locale, tmp, new_lc_numeric_buf,
-                      _numeric_locale + 1);
+    rebase_locale_buf (_numeric_locale, _numeric_locale + 1, tmp,
+                      new_lc_numeric_buf, lc_numeric_ptr);
   if (*lc_numeric_buf)
     free (*lc_numeric_buf);
   *lc_numeric_buf = tmp;
@@ -1010,8 +1010,8 @@ __set_lc_monetary_from_win (const char *name,
       return -1;
     }
   if (tmp != new_lc_monetary_buf)
-    rebase_locale_buf (_monetary_locale, tmp, new_lc_monetary_buf,
-                      _monetary_locale + 1);
+    rebase_locale_buf (_monetary_locale, _monetary_locale + 1, tmp,
+                      new_lc_monetary_buf, lc_monetary_ptr);
   if (*lc_monetary_buf)
     free (*lc_monetary_buf);
   *lc_monetary_buf = tmp;