Bug 14247 - newlocale doesn't always set errno upon failure return
Summary: newlocale doesn't always set errno upon failure return
Status: NEW
Alias: None
Product: glibc
Classification: Unclassified
Component: locale (show other bugs)
Version: 2.15
: P2 normal
Target Milestone: ---
Assignee: Not yet assigned to anyone
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2012-06-15 03:45 UTC by law
Modified: 2015-08-27 21:57 UTC (History)
1 user (show)

See Also:
Host:
Target:
Build:
Last reconfirmed:
fweimer: security-


Attachments
Potential fix (375 bytes, application/octet-stream)
2012-06-15 03:45 UTC, law
Details

Note You need to log in before you can comment on or make changes to this bug.
Description law 2012-06-15 03:45:50 UTC
Created attachment 6449 [details]
Potential fix

newlocale() neglects to set errno to an appropriate value when failing, if it has already been asked about the same incorrect locale name.

#include <stdio.h>
#include <errno.h>
#include <locale.h>

int
main(int argc, char **argv)
{
  locale_t loc;

  setlocale(LC_ALL, "C");

  errno = 0;
  loc = newlocale(LC_COLLATE_MASK | LC_CTYPE_MASK,
		  "nb_no.utf8",
		  0);
  printf("result = %p errno = %d\n", loc, errno);

  errno = 0;
  loc = newlocale(LC_COLLATE_MASK | LC_CTYPE_MASK,
		  "nb_no.utf8",
		  0);
  printf("result = %p errno = %d\n", loc, errno);

  return 0;
}

  
Actual results:
result = (nil) errno = 2
result = (nil) errno = 0

Expected results:
result = (nil) errno = 2
result = (nil) errno = 2     (or at least something other than 0)