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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.