From: Matthew Dobson <colpatch@us.ibm.com>
To: joe.korty@ccur.com
Cc: Paul Jackson <pj@sgi.com>,
akpm@osdl.org, paulus@samba.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH] bitmap parsing/printing routines, version 4
Date: Mon, 19 Jan 2004 13:17:26 -0800 [thread overview]
Message-ID: <400C4966.2030803@us.ibm.com> (raw)
In-Reply-To: <20040117183929.GA24185@tsunami.ccur.com>
[-- Attachment #1: Type: text/plain, Size: 2189 bytes --]
Joe Korty wrote:
> This release of the bitmap parser/printer continues the cycle of making
> ever-smaller changes to the base code.
>
> The most significant change this time around is to be sure every
> character in the string is scanned for correctness. In the previous
> version, the scan would stop on the first whitespace character following
> a non-whitespace character. There was no determination made if that was
> the start of either embedded or trailing whitspace -- it was assumed to
> be trailing.
>
> I gradually came to feel that examining the whole string was important, as
> the parser does not return a pointer to where it stopped as the string(3)
> family does, so it is not possible for the caller to easily determine
> if the condition stopping the scan was reasonable or not.
>
> ChangeLog:
> o remove trailing whitespace early termination.
> o add leading / embedded / trailing whitespace tests.
> o 'extern' not needed on prototypes (Bill Irwin)
> o made terse variable names readable.
> o continued the reduction of the algorithm to simpler forms.
>
> This release concludes my contributions to this patch, other than changes
> driven by user requests and experience.
>
> Against 2.6.1-mm4.
>
> Joe
Joe,
I've attatched a small patch with some *small* changes, and the
addition of a whole lotta comments. I'd like to see what you think.
Changes:
1) Added a missing '"' in the comment for the bitmap_parse function
2) Renamed 'oc' to 'old_c' for readability
3) Remove "totaldigits == 0" check at the end of bitmap_parse. I
believe this check is redundant. The only way that totaldigits could be
0 at the end of the function is if ndigits is also 0 (because they're
both incremented at the same time), and this condition is already
checked for at the end of each chunk parsed. Is this correct?
Additions:
4) A whole bunch of comments. Are these all correct?
None of the things in my patch (with the possible exception of #3)
change the functionality of the code, which looks great.
Andrew, I agree with Paul's "thumbs-up" of Joe's patch. My patch is
solely meant to increase the readability of the bitmap_parse function.
Cheers!
-Matt
[-- Attachment #2: joe_korty-bitmap-fix.patch --]
[-- Type: text/plain, Size: 3040 bytes --]
--- linux-2.6.1-joe_korty-bitmap/lib/bitmap.c.orig Mon Jan 19 11:45:32 2004
+++ linux-2.6.1-joe_korty-bitmap/lib/bitmap.c Mon Jan 19 13:11:24 2004
@@ -209,13 +209,13 @@ EXPORT_SYMBOL(bitmap_snprintf);
* bits of the resultant bitmask. No chunk may specify a value larger
* than 32 bits (-EOVERFLOW), and if a chunk specifies a smaller value
* then leading 0-bits are prepended. -EINVAL is returned for illegal
- * characters and for grouping errors such as "1,,5", ,44", "," and "".
+ * characters and for grouping errors such as "1,,5", ",44", "," and "".
* Leading and trailing whitespace accepted, but not embedded whitespace.
*/
int bitmap_parse(const char __user *ubuf, unsigned int ubuflen,
unsigned long *maskp, int nmaskbits)
{
- int i, c, oc, ndigits, totaldigits, nchunks, nbits;
+ int i, c, old_c, totaldigits, ndigits, nchunks, nbits;
u32 chunk;
bitmap_clear(maskp, nmaskbits);
@@ -223,40 +223,73 @@ int bitmap_parse(const char __user *ubuf
nchunks = nbits = totaldigits = c = 0;
do {
chunk = ndigits = 0;
+
+ /* Get the next chunk of the bitmap */
while (ubuflen) {
- oc = c;
+ /* Remember the last char & get the next char */
+ old_c = c;
if (get_user(c, ubuf++))
return -EFAULT;
ubuflen--;
+
+ /* Ignore spaces */
if (isspace(c))
continue;
- if (totaldigits && c && isspace(oc))
+
+ /*
+ * If the last character was a space and the current
+ * character isn't '\0' we've got embedded whitespace.
+ * This is a no-no, so throw an error.
+ */
+ if (totaldigits && c && isspace(old_c))
return -EINVAL;
+
+ /* A '\0' or a ',' signal the end of the chunk */
if (!c || c == ',')
break;
+
+ /* A non-hexdigit is also a no-no, so throw an error */
if (!isxdigit(c))
return -EINVAL;
+
+ /*
+ * Make sure there are at least 4 free bits in 'chunk'.
+ * If not, this hexdigit will overflow 'chunk', so
+ * throw an error.
+ */
if (chunk & ~((1UL << (CHUNKSZ - 4)) - 1))
return -EOVERFLOW;
+
+ /*
+ * Add this expanded hexdigit to 'chunk' and increment
+ * both the current chunk & total digit counts.
+ */
chunk = (chunk << 4) | unhex(c);
ndigits++; totaldigits++;
}
+ /* Empty chunks are another no-no. Throw an error. */
if (ndigits == 0)
return -EINVAL;
+
+ /* If the first chunk is all 0's, just move to the next one */
if (nchunks == 0 && chunk == 0)
continue;
+
+ /* Shift the bitmap right to make room for this chunk */
bitmap_shift_right(maskp, maskp, CHUNKSZ, nmaskbits);
+
+ /* Copy the chunk into the bitmap, and increment chunk count */
for (i = 0; i < CHUNKSZ; i++)
if (chunk & (1 << i))
set_bit(i, maskp);
nchunks++;
+
+ /* Increment the bit count & make sure we didn't overflow */
nbits += (nchunks == 1) ? nbits_to_hold_value(chunk) : CHUNKSZ;
if (nbits > nmaskbits)
return -EOVERFLOW;
} while (ubuflen && c == ',');
- if (totaldigits == 0)
- return -EINVAL;
return 0;
}
EXPORT_SYMBOL(bitmap_parse);
next prev parent reply other threads:[~2004-01-19 21:22 UTC|newest]
Thread overview: 56+ messages / expand[flat|nested] mbox.gz Atom feed top
2004-01-07 16:56 seperator error in __mask_snprintf_len Joe Korty
2004-01-07 19:32 ` Andrew Morton
2004-01-08 13:11 ` Paul Jackson
2004-01-08 22:50 ` Paul Mackerras
2004-01-08 22:59 ` Joe Korty
2004-01-09 0:07 ` Paul Mackerras
2004-01-09 1:11 ` Paul Jackson
2004-01-14 23:03 ` Paul Jackson
2004-01-15 0:27 ` Joe Korty
2004-01-15 0:37 ` Paul Jackson
2004-01-15 4:40 ` Paul Jackson
2004-01-15 16:15 ` Andrew Morton
2004-01-15 18:15 ` Joe Korty
2004-01-16 0:17 ` Paul Jackson
2004-01-16 0:48 ` Joe Korty
2004-01-16 1:48 ` Paul Jackson
2004-01-16 23:29 ` Matthew Dobson
2004-01-17 6:36 ` [PATCH] bitmap parsing routines, version 3 Joe Korty
2004-01-17 10:08 ` Paul Jackson
[not found] ` <20040117145545.GA16318@tsunami.ccur.com>
2004-01-17 15:36 ` Joe Korty
2004-01-17 23:33 ` Paul Jackson
2004-01-18 5:52 ` William Lee Irwin III
2004-01-18 7:03 ` Paul Jackson
2004-01-17 18:39 ` [PATCH] bitmap parsing/printing routines, version 4 Joe Korty
2004-01-17 23:36 ` Paul Jackson
2004-01-19 21:17 ` Matthew Dobson [this message]
2004-01-20 0:17 ` Paul Jackson
2004-01-20 3:57 ` Joe Korty
2004-01-20 4:15 ` Paul Jackson
2004-01-20 5:41 ` Randy Dunlap
2004-01-20 7:03 ` Matthew Dobson
2004-01-20 15:36 ` Joe Korty
2004-01-20 17:06 ` Matthew Dobson
2004-01-17 9:12 ` seperator error in __mask_snprintf_len Paul Jackson
2004-01-16 5:14 ` Paul Jackson
2004-01-16 5:26 ` Andrew Morton
2004-01-16 5:52 ` William Lee Irwin III
2004-01-16 14:23 ` Joe Korty
2004-01-17 10:07 ` Paul Jackson
2004-01-15 22:53 ` Paul Jackson
2004-01-16 1:06 ` Andrew Morton
2004-01-16 2:54 ` Paul Jackson
2004-01-09 14:28 ` Paul Jackson
2004-01-09 14:46 ` Paul Jackson
2004-01-09 15:14 ` Andreas Schwab
2004-01-09 15:25 ` Christoph Hellwig
2004-01-09 17:23 ` Paul Jackson
2004-01-12 0:09 ` Joe Korty
2004-01-12 21:41 ` Paul Jackson
2004-01-12 22:00 ` Joe Korty
2004-01-12 22:28 ` Paul Jackson
2004-01-12 22:39 ` Joe Korty
2004-01-09 14:57 ` Paul Jackson
2004-01-08 1:06 ` Paul Jackson
2004-01-08 3:32 ` Joe Korty
2004-01-08 10:39 ` Paul Jackson
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=400C4966.2030803@us.ibm.com \
--to=colpatch@us.ibm.com \
--cc=akpm@osdl.org \
--cc=joe.korty@ccur.com \
--cc=linux-kernel@vger.kernel.org \
--cc=paulus@samba.org \
--cc=pj@sgi.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
Powered by JetHome