[pve-devel] [PATCH v2 cluster 1/2] pmxcfs: add verify_token IPCC request
Thomas Lamprecht
t.lamprecht at proxmox.com
Mon Nov 25 09:02:03 CET 2019
On 11/25/19 8:02 AM, Fabian Grünbichler wrote:
>>> +
>>> + while (line != NULL) {
>>> + next_line = memchr(line, '\n', remaining);
>>> + if (next_line != NULL) {
>>> + *next_line = '\0';
>> unnecessary, just use (next_line or end) - line as boundaries and do a
>> strncmp below[0]
> but I actually want to ensure I compare both token and the full line, no
> matter which one is longer.
>
> e.g., if the file contains (for whatever reason!)
> someuser at pve!token asd213
> someotheruser at pve!token asdas-asdas-dsadsa
>
> and I compare against
>
> someuser at pve!token asd213-dfsdasads-asdsdas-dasds
>
> I don't want to compare across the newline! while it should never be
> able to produce a false match (we reject token values as needle that
> contain a newline), it seems like a good safeguard to ensure we only
> match one full line at a time..
>
>>> + }
>>> + /* we ensure above that both are properly terminated */
>> you ain't if next_line was NULL, i.e., no \n at EOF, at least if you
>> do not do your out-of-bound write to *end = 0 anymore ;-)
>>
>>> + if (strcmp(line, rh->token) == 0) {
>> [0] ...here
>>
>> effectively I'd go with:
>>
>> int bytes_read = memdb_read(memdb, "priv/token.cfg", &tmp);
>> size_t remaining = bytes_read > 0 ? bytes_read : 0;
>> if (tmp != NULL && remaining >= tokenlen) {
>> char *line = (char *) tmp;
>> char *next_newline;
>> char *const end = line + remaining;
>>
>> while (line != NULL) {
>> next_newline = memchr(line, '\n', remaining);
>> if (next_newline != NULL) {
>> *next_newline = '\0';
> so in practice I'd add another check here that the current line
> (next_newline - line) is as long as rh->token, and if it is not, proceed
> directly to the next line. this might also speed it up, since we now
> only do the full string/memory comparison against stored values where
> the full tokenid has the same length as the one we are looking for.
>
> if next_newline == NULL, then we must be in the last loop, and remaining
> should be exactly tokenlen, so we could check that in an else branch and
> bail if that check fails.
>
sounds OK.
>> }
>>
>> if (memcmp(line, rh->token, tokenlen) == 0) {
>> result = 0; // found
>> break;
>> }
>>
>> line = next_newline;
>> if (line != NULL) {
>> line += 1;
>> remaining = end - line;
>> if (remaining < tokenlen) {
>> result = -ENOENT;
>> break;
>> }
>> }
>> }
>> if (line == NULL) {
>> result = -ENOENT;
>> }
>> g_free(tmp);
>> } else {
>> cfs_debug("token: token.cfg does not exist - ENOENT");
>> result = -ENOENT;
>> }
>>
>> here, the actually search part could be moved out to a is_line_in_conf
>> function, as it's completely agnostic to tokens itself..
> sounds like a good idea - but where to put it? actually create the msg
> and put most of the code in status.c, like for the property getter? or
> keep the token stuff inline, and just move the line-search to
> cfs-utils.c?
>
I'd rather use cfs-utils.c or a completely new file, e.g., ipc-utils.c,
where alsot the config property getter stuff could be moved to.
If unsure just keep it inline for now.
More information about the pve-devel
mailing list