diff options
author | Andrew Tridgell <tridge@samba.org> | 2000-05-04 08:58:07 +0000 |
---|---|---|
committer | Andrew Tridgell <tridge@samba.org> | 2000-05-04 08:58:07 +0000 |
commit | 420d7e02dca5c207091ded625082b4f5df2b9c65 (patch) | |
tree | 719c92cf957103970c4e1e47cbe058eb68eb5096 | |
parent | f3a861e04e33901c89408a9c89ebaa81fc606f97 (diff) | |
download | samba-420d7e02dca5c207091ded625082b4f5df2b9c65.tar.gz samba-420d7e02dca5c207091ded625082b4f5df2b9c65.tar.bz2 samba-420d7e02dca5c207091ded625082b4f5df2b9c65.zip |
an even simpler example of NT gettings its locking code wrong. This
one doesn't even need two connections to the box, just two file handles.
it is a very simple case actually, and one I think will happen quite a
lot in real life. I wonder how they haven't noticed it? I checked and
W2K has the same bug.
(This used to be commit 0b335e415818028ac0daad5f99c2fd9086a2a656)
-rw-r--r-- | source3/utils/locktest.c | 34 |
1 files changed, 14 insertions, 20 deletions
diff --git a/source3/utils/locktest.c b/source3/utils/locktest.c index 0d1c1719a8..d52d023f25 100644 --- a/source3/utils/locktest.c +++ b/source3/utils/locktest.c @@ -38,6 +38,8 @@ static BOOL analyze; #define LOCK_PCT 25 #define UNLOCK_PCT 65 #define RANGE_MULTIPLE 32 +#define NCONNECTIONS 2 +#define NFILES 2 struct record { char r1, r2; @@ -47,16 +49,10 @@ struct record { }; static struct record preset[] = { -#if 0 -{36, 5, 1, 1, 1, 2, 1}, -{ 2, 6, 0, 1, 0, 2, 1}, -{53, 92, 1, 1, 0, 0, 1}, -{99, 11, 1, 1, 2, 1, 1}, -#endif -{36, 5, 1, 1, 1888, 960, 1}, -{47, 23, 0, 1, 0, 2176, 1}, -{84, 95, 1, 1, 3072, 96, 1}, -{65, 14, 0, 0, 2752, 352, 1}, +{36, 5, 0, 0, 0, 8, 1}, +{ 2, 6, 0, 1, 0, 1, 1}, +{53, 92, 0, 0, 0, 0, 1}, +{99, 11, 0, 0, 7, 1, 1}, }; static struct record *recorded; @@ -178,12 +174,10 @@ static void reconnect(struct cli_state *cli[2][2], int fnum[2][2][2], share[0] = share1; share[1] = share2; - - for (server=0;server<2;server++) - for (conn=0;conn<2;conn++) { + for (conn=0;conn<NCONNECTIONS;conn++) { if (cli[server][conn]) { - for (f=0;f<2;f++) { + for (f=0;f<NFILES;f++) { cli_close(cli[server][conn], fnum[server][conn][f]); } cli_ulogoff(cli[server][conn]); @@ -283,8 +277,8 @@ static void close_files(struct cli_state *cli[2][2], int server, conn, f; for (server=0;server<2;server++) - for (conn=0;conn<2;conn++) - for (f=0;f<2;f++) { + for (conn=0;conn<NCONNECTIONS;conn++) + for (f=0;f<NFILES;f++) { if (fnum[server][conn][f] != -1) { cli_close(cli[server][conn], fnum[server][conn][f]); fnum[server][conn][f] = -1; @@ -300,8 +294,8 @@ static void open_files(struct cli_state *cli[2][2], int server, conn, f; for (server=0;server<2;server++) - for (conn=0;conn<2;conn++) - for (f=0;f<2;f++) { + for (conn=0;conn<NCONNECTIONS;conn++) + for (f=0;f<NFILES;f++) { fnum[server][conn][f] = cli_open(cli[server][conn], FILENAME, O_RDWR|O_CREAT, DENY_NONE); @@ -353,8 +347,8 @@ static void test_locks(char *share1, char *share2) if (n < sizeof(preset) / sizeof(preset[0])) { recorded[n] = preset[n]; } else { - recorded[n].conn = random() % 2; - recorded[n].f = random() % 2; + recorded[n].conn = random() % NCONNECTIONS; + recorded[n].f = random() % NFILES; recorded[n].start = random() % (LOCKRANGE-1); recorded[n].len = 1 + random() % (LOCKRANGE-recorded[n].start); recorded[n].start *= RANGE_MULTIPLE; |