Page MenuHomeFreeBSD

libc: Fix a few bugs in the xlocale collation code.
ClosedPublic

Authored by markj on Thu, Jan 9, 4:42 PM.

Details

Summary
  • Fix checks for mmap() failures.
  • Set the "map" and "maplen" fields of struct xlocale_collate so that the destructor actually works.
  • Free an already-mapped collation file before loading a new one into the global table.
  • Harmonize the prototype and definition of __collate_load_tables_l() by adding the "static" qualifier to the latter.

PR: 243195

Diff Detail

Repository
rS FreeBSD src repository
Lint
Automatic diff as part of commit; lint not applicable.
Unit
Automatic diff as part of commit; unit tests not applicable.

Event Timeline

markj created this revision.Thu, Jan 9, 4:42 PM
markj edited the summary of this revision. (Show Details)Thu, Jan 9, 4:43 PM
markj added reviewers: bapt, yuripv, cem.
markj updated this revision to Diff 66561.Thu, Jan 9, 4:51 PM

Defer the unmap until we are sure that __collate_load_tables_l() won't fail.

yuripv added a comment.Thu, Jan 9, 5:38 PM

I wonder if we could instead check if we have the table already loaded and return without doing everything over and over again. Something like the following right at the start:

if (table->__collate_load_error == 0 && table->header != NULL && strcmp(table->header.locale, encoding) == 0)
    return (_LDP_LOADED);

Not completely sure about the table->header check here as we already checked that the table was loaded, but it's just an idea.

(P.S. I think encoding is really a wrong argument name here, as it's full locale name.)

yuripv added a comment.Thu, Jan 9, 5:43 PM

I wonder if we could instead check if we have the table already loaded and return without doing everything over and over again. Something like the following right at the start:

if (table->__collate_load_error == 0 && table->header != NULL && strcmp(table->header.locale, encoding) == 0)
    return (_LDP_LOADED);

Not completely sure about the table->header check here as we already checked that the table was loaded, but it's just an idea.
(P.S. I think encoding is really a wrong argument name here, as it's full locale name.)

Nevermind me, I obviously can't read several lines up :)

yuripv accepted this revision.Thu, Jan 9, 5:43 PM
This revision is now accepted and ready to land.Thu, Jan 9, 5:43 PM
markj added a comment.Thu, Jan 9, 6:07 PM

I wonder if we could instead check if we have the table already loaded and return without doing everything over and over again. Something like the following right at the start:

if (table->__collate_load_error == 0 && table->header != NULL && strcmp(table->header.locale, encoding) == 0)
    return (_LDP_LOADED);

Not completely sure about the table->header check here as we already checked that the table was loaded, but it's just an idea.
(P.S. I think encoding is really a wrong argument name here, as it's full locale name.)

Nevermind me, I obviously can't read several lines up :)

Hmm, I don't see what lines you are referring to. Indeed, this function does not handle the case where a table is already loaded. I'd prefer to fix that separately though.

cem accepted this revision.Thu, Jan 9, 7:24 PM
This revision was automatically updated to reflect the committed changes.