From 439d79535278cca4149434a457874addd94fee0f Mon Sep 17 00:00:00 2001 From: Peter Maydell Date: Fri, 26 Dec 2008 21:54:19 +0000 Subject: [PATCH] * sbr/m_getfld.c: fix two bugs which could cause us to walk off the beginning of the stdio or prefix-string buffer when checking for presence of the end-of-message delimiter in some situations. This might cause inc to dump core if you were unlucky. (This was Debian bug 359167.) * test/tests/inc/{md5sums,msgheader.txt,test-deb359167, test-eom-align,fromline.txt,filler.txt,deb359167.mbox}: new tests both for the specific problem and to try to check various alignments of the eom string with the stdio buffer ending. * test/common.sh: Added some functions for doing progress indicators. --- ChangeLog | 11 +- sbr/m_getfld.c | 41 +++-- test/common.sh | 19 +++ test/tests/inc/deb359167.mbox | Bin 0 -> 3324 bytes test/tests/inc/filler.txt | 356 +++++++++++++++++++++++++++++++++++++++++ test/tests/inc/fromline.txt | 1 + test/tests/inc/md5sums | 3 + test/tests/inc/msgheader.txt | 5 + test/tests/inc/test-deb359167 | 18 +++ test/tests/inc/test-eom-align | 123 ++++++++++++++ 10 files changed, 562 insertions(+), 15 deletions(-) create mode 100644 test/tests/inc/deb359167.mbox create mode 100644 test/tests/inc/filler.txt create mode 100644 test/tests/inc/fromline.txt create mode 100644 test/tests/inc/md5sums create mode 100644 test/tests/inc/msgheader.txt create mode 100644 test/tests/inc/test-deb359167 create mode 100644 test/tests/inc/test-eom-align diff --git a/ChangeLog b/ChangeLog index d1082ce..5817d9a 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,8 +1,17 @@ 2008-12-26 Peter Maydell + * sbr/m_getfld.c: fix two bugs which could cause us to walk off + the beginning of the stdio or prefix-string buffer when checking + for presence of the end-of-message delimiter in some situations. + This might cause inc to dump core if you were unlucky. (This was + Debian bug 359167.) + * test/tests/inc/{md5sums,msgheader.txt,test-deb359167, + test-eom-align,fromline.txt,filler.txt,deb359167.mbox}: new tests + both for the specific problem and to try to check various alignments + of the eom string with the stdio buffer ending. * test/common.sh: new file for common utility functions for the test scripts. Moved findprog out of manpage test script into this - new file. + new file. Added some functions for doing progress indicators. 2008-12-25 Peter Maydell diff --git a/sbr/m_getfld.c b/sbr/m_getfld.c index 9424188..ecbbd3c 100644 --- a/sbr/m_getfld.c +++ b/sbr/m_getfld.c @@ -522,22 +522,35 @@ m_getfld (int state, unsigned char *name, unsigned char *buf, ep = bp + c - 1; if ((sp = pat_map[*ep])) { do { - cp = sp; - while (*--ep == *--cp) - ; - if (cp < fdelim) { - if (ep >= bp) - /* - * ep < bp means that all the buffer - * contains is a prefix of delim. - * If this prefix is really a delim, the - * m_eom call at entry should have found - * it. Thus it's not a delim and we can - * take all of it. + /* This if() is true unless (a) the buffer is too + * small to contain this delimiter prefix, or + * (b) it contains exactly enough chars for the + * delimiter prefix. + * For case (a) obviously we aren't going to match. + * For case (b), if the buffer really contained exactly + * a delim prefix, then the m_eom call at entry + * should have found it. Thus it's not a delim + * and we know we won't get a match. + */ + if (((sp - fdelim) + 2) <= c) { + cp = sp; + /* Unfortunately although fdelim has a preceding NUL + * we can't use this as a sentinel in case the buffer + * contains a NUL in exactly the wrong place (this + * would cause us to run off the front of fdelim). + */ + while (*--ep == *--cp) + if (cp < fdelim) + break; + if (cp < fdelim) { + /* we matched the entire delim prefix, + * so only take the buffer up to there. + * we know ep >= bp -- check above prevents underrun */ c = (ep - bp) + 2; - break; - } + break; + } + } /* try matching one less char of delim string */ ep = bp + c - 1; } while (--sp > fdelim); diff --git a/test/common.sh b/test/common.sh index 1c675e2..5d46c8c 100644 --- a/test/common.sh +++ b/test/common.sh @@ -31,3 +31,22 @@ require_prog () test_skip "missing $1" fi } + +# Some stuff for doing silly progress indicators +progress_update () +{ + THIS="$1" + FIRST="$2" + LAST="$3" + RANGE="$(($LAST - $FIRST))" + PROG="$(($THIS - $FIRST))" + # this automatically rounds to nearest integer + PERC="$(((100 * $PROG) / $RANGE))" + # note \r so next update will overwrite + printf "%3d%%\r" $PERC +} + +progress_done () +{ + printf "100%%\n" +} diff --git a/test/tests/inc/deb359167.mbox b/test/tests/inc/deb359167.mbox new file mode 100644 index 0000000000000000000000000000000000000000..5e861161ec2c63c6a71ad3939e0f959d47507d45 GIT binary patch literal 3324 zcmb_d%Wm5+5bQPl3R=m*MkASL`O%zu;U^SqNwV4S5P|G?R#hf8_S>#Gw=9F}aG^kn*Rb!B>O zCQLuI=I638iZ|)W8Aeh%$NEM>x=eQgRq6<{*kPf;#_ZgbFd1OjQPV4YMTGOwm>3V&gqNuHyNPEjYWyV6bbPMA%&<`sxgPSgGzeC zgM~W=ciwIxx7DeUUPunH8mYae8Mo4DKtI0IoG?5mR12Lu@LW#|sn% zlSA2s`-p{SIagPo+h70|NUYq7iVnEPvIBf_(2KJ^QaMR)LyJ(&d0$bidN93k%fXGd zZ#1a%9Oa~!5-?1H0XuuKoOc6RgE7vHiFw8w@e-5ksd*G^F|N9?kJ|&>J>!U0Xx3rJ zz@lkmml)0<55tIYI0b!z`+PAe0sw5`sbz@T2QPZ8QGuX2-EPhhgu%W7E+3zoOw*!F z2fL>omQ@v3f`P&6p46hJ?ECOoPZ^@6;!w)9e{*`~mKMn6k>~chZIki^AG1}pB{O{1 zIpmz4Qevv^OxBG`Fer=k9|q`G^NdWdjc~b@7PF13q{8vqaZrIVK!QopXsE?7Asf*! zH5kO=j#Ha7YBCt@Or~|l4-!UWayo!J$$yIYf-$8@*8S74G}V+z1VQGCJhCvcV=y8h zq;(%MT;r|z#cCOi?7LM;>Ga8fIoGD8Pf*Q4S9FNz|Bw9tTlx)4#DP)Ruk6gg2_b+E zBYs<@>fdFqpi}+Q_<1!PlfIfqn~e~cSvauTG(?9yj#;kOQoDSJv>SU=vFpAR0=VS| zXAnm>RqJuD4he7u3&*|*jf4QPg4>q|E<7N!1fmts85g}OE^laQxwBup1>%T)4EsS#yBHcv-#ByE zbbk+bnSJ%pGt#v5_r@NMAK&k{C^&^puo>X+hikmIJ_CWr1V8y8oW#|X%SNAw5kp^v o2b@D;Z_Po}IGkXqtK8dU-Q+D`cQoV&v7oRX_y>(+N?%g?0~%;7GXMYp literal 0 HcmV?d00001 diff --git a/test/tests/inc/filler.txt b/test/tests/inc/filler.txt new file mode 100644 index 0000000..7be957f --- /dev/null +++ b/test/tests/inc/filler.txt @@ -0,0 +1,356 @@ +CHAPTER I. MR. SHERLOCK HOLMES. + + +IN the year 1878 I took my degree of Doctor of Medicine of the +University of London, and proceeded to Netley to go through the course +prescribed for surgeons in the army. Having completed my studies there, +I was duly attached to the Fifth Northumberland Fusiliers as Assistant +Surgeon. The regiment was stationed in India at the time, and before +I could join it, the second Afghan war had broken out. On landing at +Bombay, I learned that my corps had advanced through the passes, and +was already deep in the enemy's country. I followed, however, with many +other officers who were in the same situation as myself, and succeeded +in reaching Candahar in safety, where I found my regiment, and at once +entered upon my new duties. + +The campaign brought honours and promotion to many, but for me it had +nothing but misfortune and disaster. I was removed from my brigade and +attached to the Berkshires, with whom I served at the fatal battle of +Maiwand. There I was struck on the shoulder by a Jezail bullet, which +shattered the bone and grazed the subclavian artery. I should have +fallen into the hands of the murderous Ghazis had it not been for the +devotion and courage shown by Murray, my orderly, who threw me across a +pack-horse, and succeeded in bringing me safely to the British lines. + +Worn with pain, and weak from the prolonged hardships which I had +undergone, I was removed, with a great train of wounded sufferers, to +the base hospital at Peshawar. Here I rallied, and had already improved +so far as to be able to walk about the wards, and even to bask a little +upon the verandah, when I was struck down by enteric fever, that curse +of our Indian possessions. For months my life was despaired of, and +when at last I came to myself and became convalescent, I was so weak and +emaciated that a medical board determined that not a day should be lost +in sending me back to England. I was dispatched, accordingly, in the +troopship "Orontes," and landed a month later on Portsmouth jetty, with +my health irretrievably ruined, but with permission from a paternal +government to spend the next nine months in attempting to improve it. + +I had neither kith nor kin in England, and was therefore as free as +air--or as free as an income of eleven shillings and sixpence a day will +permit a man to be. Under such circumstances, I naturally gravitated to +London, that great cesspool into which all the loungers and idlers of +the Empire are irresistibly drained. There I stayed for some time at +a private hotel in the Strand, leading a comfortless, meaningless +existence, and spending such money as I had, considerably more freely +than I ought. So alarming did the state of my finances become, that +I soon realized that I must either leave the metropolis and rusticate +somewhere in the country, or that I must make a complete alteration in +my style of living. Choosing the latter alternative, I began by making +up my mind to leave the hotel, and to take up my quarters in some less +pretentious and less expensive domicile. + +On the very day that I had come to this conclusion, I was standing at +the Criterion Bar, when some one tapped me on the shoulder, and turning +round I recognized young Stamford, who had been a dresser under me at +Barts. The sight of a friendly face in the great wilderness of London is +a pleasant thing indeed to a lonely man. In old days Stamford had never +been a particular crony of mine, but now I hailed him with enthusiasm, +and he, in his turn, appeared to be delighted to see me. In the +exuberance of my joy, I asked him to lunch with me at the Holborn, and +we started off together in a hansom. + +"Whatever have you been doing with yourself, Watson?" he asked in +undisguised wonder, as we rattled through the crowded London streets. +"You are as thin as a lath and as brown as a nut." + +I gave him a short sketch of my adventures, and had hardly concluded it +by the time that we reached our destination. + +"Poor devil!" he said, commiseratingly, after he had listened to my +misfortunes. "What are you up to now?" + +"Looking for lodgings." [3] I answered. "Trying to solve the problem +as to whether it is possible to get comfortable rooms at a reasonable +price." + +"That's a strange thing," remarked my companion; "you are the second man +to-day that has used that expression to me." + +"And who was the first?" I asked. + +"A fellow who is working at the chemical laboratory up at the hospital. +He was bemoaning himself this morning because he could not get someone +to go halves with him in some nice rooms which he had found, and which +were too much for his purse." + +"By Jove!" I cried, "if he really wants someone to share the rooms and +the expense, I am the very man for him. I should prefer having a partner +to being alone." + +Young Stamford looked rather strangely at me over his wine-glass. "You +don't know Sherlock Holmes yet," he said; "perhaps you would not care +for him as a constant companion." + +"Why, what is there against him?" + +"Oh, I didn't say there was anything against him. He is a little queer +in his ideas--an enthusiast in some branches of science. As far as I +know he is a decent fellow enough." + +"A medical student, I suppose?" said I. + +"No--I have no idea what he intends to go in for. I believe he is well +up in anatomy, and he is a first-class chemist; but, as far as I know, +he has never taken out any systematic medical classes. His studies are +very desultory and eccentric, but he has amassed a lot of out-of-the way +knowledge which would astonish his professors." + +"Did you never ask him what he was going in for?" I asked. + +"No; he is not a man that it is easy to draw out, though he can be +communicative enough when the fancy seizes him." + +"I should like to meet him," I said. "If I am to lodge with anyone, I +should prefer a man of studious and quiet habits. I am not strong +enough yet to stand much noise or excitement. I had enough of both in +Afghanistan to last me for the remainder of my natural existence. How +could I meet this friend of yours?" + +"He is sure to be at the laboratory," returned my companion. "He either +avoids the place for weeks, or else he works there from morning to +night. If you like, we shall drive round together after luncheon." + +"Certainly," I answered, and the conversation drifted away into other +channels. + +As we made our way to the hospital after leaving the Holborn, Stamford +gave me a few more particulars about the gentleman whom I proposed to +take as a fellow-lodger. + +"You mustn't blame me if you don't get on with him," he said; "I know +nothing more of him than I have learned from meeting him occasionally in +the laboratory. You proposed this arrangement, so you must not hold me +responsible." + +"If we don't get on it will be easy to part company," I answered. "It +seems to me, Stamford," I added, looking hard at my companion, "that you +have some reason for washing your hands of the matter. Is this fellow's +temper so formidable, or what is it? Don't be mealy-mouthed about it." + +"It is not easy to express the inexpressible," he answered with a laugh. +"Holmes is a little too scientific for my tastes--it approaches to +cold-bloodedness. I could imagine his giving a friend a little pinch of +the latest vegetable alkaloid, not out of malevolence, you understand, +but simply out of a spirit of inquiry in order to have an accurate idea +of the effects. To do him justice, I think that he would take it himself +with the same readiness. He appears to have a passion for definite and +exact knowledge." + +"Very right too." + +"Yes, but it may be pushed to excess. When it comes to beating the +subjects in the dissecting-rooms with a stick, it is certainly taking +rather a bizarre shape." + +"Beating the subjects!" + +"Yes, to verify how far bruises may be produced after death. I saw him +at it with my own eyes." + +"And yet you say he is not a medical student?" + +"No. Heaven knows what the objects of his studies are. But here we +are, and you must form your own impressions about him." As he spoke, we +turned down a narrow lane and passed through a small side-door, which +opened into a wing of the great hospital. It was familiar ground to me, +and I needed no guiding as we ascended the bleak stone staircase and +made our way down the long corridor with its vista of whitewashed +wall and dun-coloured doors. Near the further end a low arched passage +branched away from it and led to the chemical laboratory. + +This was a lofty chamber, lined and littered with countless bottles. +Broad, low tables were scattered about, which bristled with retorts, +test-tubes, and little Bunsen lamps, with their blue flickering flames. +There was only one student in the room, who was bending over a distant +table absorbed in his work. At the sound of our steps he glanced round +and sprang to his feet with a cry of pleasure. "I've found it! I've +found it," he shouted to my companion, running towards us with a +test-tube in his hand. "I have found a re-agent which is precipitated +by hoemoglobin, [4] and by nothing else." Had he discovered a gold mine, +greater delight could not have shone upon his features. + +"Dr. Watson, Mr. Sherlock Holmes," said Stamford, introducing us. + +"How are you?" he said cordially, gripping my hand with a strength +for which I should hardly have given him credit. "You have been in +Afghanistan, I perceive." + +"How on earth did you know that?" I asked in astonishment. + +"Never mind," said he, chuckling to himself. "The question now is about +hoemoglobin. No doubt you see the significance of this discovery of +mine?" + +"It is interesting, chemically, no doubt," I answered, "but +practically----" + +"Why, man, it is the most practical medico-legal discovery for years. +Don't you see that it gives us an infallible test for blood stains. Come +over here now!" He seized me by the coat-sleeve in his eagerness, and +drew me over to the table at which he had been working. "Let us have +some fresh blood," he said, digging a long bodkin into his finger, and +drawing off the resulting drop of blood in a chemical pipette. "Now, I +add this small quantity of blood to a litre of water. You perceive that +the resulting mixture has the appearance of pure water. The proportion +of blood cannot be more than one in a million. I have no doubt, however, +that we shall be able to obtain the characteristic reaction." As he +spoke, he threw into the vessel a few white crystals, and then added +some drops of a transparent fluid. In an instant the contents assumed a +dull mahogany colour, and a brownish dust was precipitated to the bottom +of the glass jar. + +"Ha! ha!" he cried, clapping his hands, and looking as delighted as a +child with a new toy. "What do you think of that?" + +"It seems to be a very delicate test," I remarked. + +"Beautiful! beautiful! The old Guiacum test was very clumsy and +uncertain. So is the microscopic examination for blood corpuscles. The +latter is valueless if the stains are a few hours old. Now, this appears +to act as well whether the blood is old or new. Had this test been +invented, there are hundreds of men now walking the earth who would long +ago have paid the penalty of their crimes." + +"Indeed!" I murmured. + +"Criminal cases are continually hinging upon that one point. A man is +suspected of a crime months perhaps after it has been committed. His +linen or clothes are examined, and brownish stains discovered upon them. +Are they blood stains, or mud stains, or rust stains, or fruit stains, +or what are they? That is a question which has puzzled many an expert, +and why? Because there was no reliable test. Now we have the Sherlock +Holmes' test, and there will no longer be any difficulty." + +His eyes fairly glittered as he spoke, and he put his hand over his +heart and bowed as if to some applauding crowd conjured up by his +imagination. + +"You are to be congratulated," I remarked, considerably surprised at his +enthusiasm. + +"There was the case of Von Bischoff at Frankfort last year. He would +certainly have been hung had this test been in existence. Then there was +Mason of Bradford, and the notorious Muller, and Lefevre of Montpellier, +and Samson of new Orleans. I could name a score of cases in which it +would have been decisive." + +"You seem to be a walking calendar of crime," said Stamford with a +laugh. "You might start a paper on those lines. Call it the 'Police News +of the Past.'" + +"Very interesting reading it might be made, too," remarked Sherlock +Holmes, sticking a small piece of plaster over the prick on his finger. +"I have to be careful," he continued, turning to me with a smile, "for I +dabble with poisons a good deal." He held out his hand as he spoke, and +I noticed that it was all mottled over with similar pieces of plaster, +and discoloured with strong acids. + +"We came here on business," said Stamford, sitting down on a high +three-legged stool, and pushing another one in my direction with +his foot. "My friend here wants to take diggings, and as you were +complaining that you could get no one to go halves with you, I thought +that I had better bring you together." + +Sherlock Holmes seemed delighted at the idea of sharing his rooms with +me. "I have my eye on a suite in Baker Street," he said, "which would +suit us down to the ground. You don't mind the smell of strong tobacco, +I hope?" + +"I always smoke 'ship's' myself," I answered. + +"That's good enough. I generally have chemicals about, and occasionally +do experiments. Would that annoy you?" + +"By no means." + +"Let me see--what are my other shortcomings. I get in the dumps at +times, and don't open my mouth for days on end. You must not think I am +sulky when I do that. Just let me alone, and I'll soon be right. What +have you to confess now? It's just as well for two fellows to know the +worst of one another before they begin to live together." + +I laughed at this cross-examination. "I keep a bull pup," I said, "and +I object to rows because my nerves are shaken, and I get up at all sorts +of ungodly hours, and I am extremely lazy. I have another set of vices +when I'm well, but those are the principal ones at present." + +"Do you include violin-playing in your category of rows?" he asked, +anxiously. + +"It depends on the player," I answered. "A well-played violin is a treat +for the gods--a badly-played one----" + +"Oh, that's all right," he cried, with a merry laugh. "I think we may +consider the thing as settled--that is, if the rooms are agreeable to +you." + +"When shall we see them?" + +"Call for me here at noon to-morrow, and we'll go together and settle +everything," he answered. + +"All right--noon exactly," said I, shaking his hand. + +We left him working among his chemicals, and we walked together towards +my hotel. + +"By the way," I asked suddenly, stopping and turning upon Stamford, "how +the deuce did he know that I had come from Afghanistan?" + +My companion smiled an enigmatical smile. "That's just his little +peculiarity," he said. "A good many people have wanted to know how he +finds things out." + +"Oh! a mystery is it?" I cried, rubbing my hands. "This is very piquant. +I am much obliged to you for bringing us together. 'The proper study of +mankind is man,' you know." + +"You must study him, then," Stamford said, as he bade me good-bye. +"You'll find him a knotty problem, though. I'll wager he learns more +about you than you about him. Good-bye." + +"Good-bye," I answered, and strolled on to my hotel, considerably +interested in my new acquaintance. + + +CHAPTER II. THE SCIENCE OF DEDUCTION. + + +WE met next day as he had arranged, and inspected the rooms at No. 221B, +Baker Street, of which he had spoken at our meeting. They +consisted of a couple of comfortable bed-rooms and a single large +airy sitting-room, cheerfully furnished, and illuminated by two broad +windows. So desirable in every way were the apartments, and so moderate +did the terms seem when divided between us, that the bargain was +concluded upon the spot, and we at once entered into possession. +That very evening I moved my things round from the hotel, and on the +following morning Sherlock Holmes followed me with several boxes and +portmanteaus. For a day or two we were busily employed in unpacking and +laying out our property to the best advantage. That done, we +gradually began to settle down and to accommodate ourselves to our new +surroundings. + +Holmes was certainly not a difficult man to live with. He was quiet +in his ways, and his habits were regular. It was rare for him to be +up after ten at night, and he had invariably breakfasted and gone out +before I rose in the morning. Sometimes he spent his day at the chemical +laboratory, sometimes in the dissecting-rooms, and occasionally in long +walks, which appeared to take him into the lowest portions of the City. +Nothing could exceed his energy when the working fit was upon him; but +now and again a reaction would seize him, and for days on end he would +lie upon the sofa in the sitting-room, hardly uttering a word or moving +a muscle from morning to night. On these occasions I have noticed such +a dreamy, vacant expression in his eyes, that I might have suspected him +of being addicted to the use of some narcotic, had not the temperance +and cleanliness of his whole life forbidden such a notion. + diff --git a/test/tests/inc/fromline.txt b/test/tests/inc/fromline.txt new file mode 100644 index 0000000..8bc4790 --- /dev/null +++ b/test/tests/inc/fromline.txt @@ -0,0 +1 @@ +From pm215@archaic.org.uk Fri Dec 26 15:03:52 2008 diff --git a/test/tests/inc/md5sums b/test/tests/inc/md5sums new file mode 100644 index 0000000..7f68baa --- /dev/null +++ b/test/tests/inc/md5sums @@ -0,0 +1,3 @@ +4112b1460e11bd94d30944dd464a6662 filler.txt +023aad60eab43f06cf525869a833beb4 fromline.txt +4fda7f16b29d757413cb928d6ffc5aa5 msgheader.txt diff --git a/test/tests/inc/msgheader.txt b/test/tests/inc/msgheader.txt new file mode 100644 index 0000000..f6faad4 --- /dev/null +++ b/test/tests/inc/msgheader.txt @@ -0,0 +1,5 @@ +From: Test +To: Some User +Date: Fri, 29 Sep 2006 00:00:00 +Subject: Testing message + diff --git a/test/tests/inc/test-deb359167 b/test/tests/inc/test-deb359167 new file mode 100644 index 0000000..61d3283 --- /dev/null +++ b/test/tests/inc/test-deb359167 @@ -0,0 +1,18 @@ +#!/bin/sh +# Test a variant of a mailbox which caused debian bug 359167. +set -e + +. common.sh + +THISDIR="tests/inc" + +require_prog valgrind + +TESTMBOX="$THISDIR/deb359167.mbox" + +if [ "$(md5sum "$TESTMBOX" | cut -d ' ' -f 1)" != "e6ac458b8cccba2b2fd866fb505aeb5e" ]; then + echo "Test mailbox has been corrupted" + exit 1 +fi + +valgrind --error-exitcode=1 --quiet inc -silent -file "$TESTMBOX" diff --git a/test/tests/inc/test-eom-align b/test/tests/inc/test-eom-align new file mode 100644 index 0000000..5d197ff --- /dev/null +++ b/test/tests/inc/test-eom-align @@ -0,0 +1,123 @@ +#!/bin/sh +# Test all combinations of alignment of the end-of-message delimiter +# with the end of a stdio buffer + +set -e + +. common.sh + +THISDIR="tests/inc" + +if [ ! -z "$VALGRIND_ME" ]; then + require_prog valgrind + # Lack of quotes here is important + VALGRIND="valgrind --quiet --error-exitcode=1" + echo "Running tests under valgrind: takes ages!" +else + VALGRIND= +fi + +# First check that all our various pieces of text are +# intact. (Since we're dealing in exact byte alignment +# minor corruptions such as line ending changes could +# render the tests useless.) +(cd "$THISDIR" && md5sum *.txt > "$MH_TEST_DIR/inctest.md5sums") +diff -u "$THISDIR/md5sums" "$MH_TEST_DIR/inctest.md5sums" + +FILLER="$THISDIR/filler.txt" +FROMLINE="$THISDIR/fromline.txt" +HDR="$THISDIR/msgheader.txt" + +if grep -q From "$FILLER"; then + echo "Somebody's messed with $FILLER -- it must not contain" + echo "anything that might look like a message delimiter!" + exit 1 +fi + +# a sort of worst-case guess for the buffer size; +# obviously a buffer boundary for this will be a boundary +# for any smaller power of two size. +# If you need to increase this you'll need to make filler.txt +# bigger as well. +STDIO_BUFSZ=16384 + +FROMLINESZ="$(wc -c "$FROMLINE" | cut -d ' ' -f 1)" +HDRSZ="$(wc -c "$HDR" | cut -d ' ' -f 1)" + +# makembox_A mboxname sz +# Assemble a mailbox into file mboxname, with two messages, such +# that the first is exactly sz bytes long (including its header +# and its initial 'From' line and the newline which terminates it +# but not the newline which mbox format demands after each message) +# We also leave the body of message one in mboxname.body +# (the body of message two is always $FILLER in its entirety) +makembox_A () { + MBOX="$1" + SZ=$2 + + WANTSZ="$(($SZ - $HDRSZ - $FROMLINESZ - 1))" + dd if="$FILLER" of="$MBOX.body" bs="$WANTSZ" count=1 2>/dev/null + echo >> "$MBOX.body" + cat "$FROMLINE" "$HDR" "$MBOX.body" > "$MBOX" + echo >> "$MBOX" + cat "$FROMLINE" "$HDR" "$FILLER" >> "$MBOX" + echo >> "$MBOX" +} + +# make_mbox_B mboxname sz +# Test B makes a mailbox with one message of sz bytes long, +# which ends in a partial mbox delimiter (ie part of the string +# \n\nFrom '). To both do this and be a valid mbox this means +# it has to end with two newlines (one of which is in the message +# body and one of which is the mbox format mandated one) +makembox_B () { + MBOX="$1" + SZ=$2 + + WANTSZ="$(($SZ - $HDRSZ - $FROMLINESZ - 1))" + dd if="$FILLER" of="$MBOX.body" bs="$WANTSZ" count=1 2>/dev/null + echo >> "$MBOX.body" + cat "$FROMLINE" "$HDR" "$MBOX.body" > "$MBOX" + echo >> "$MBOX" +} + +# do_one_test_A sz +# Do a single test with message one's body of size sz. +do_one_test_A () { + SZ=$1 + makembox_A "$MH_TEST_DIR/eom-align.mbox" $STDIO_BUFSZ + $VALGRIND inc -silent -file "$MH_TEST_DIR/eom-align.mbox" + # We know the messages should be 11 and 12 in inbox + # Now get the bodies back out. + sed -e '1,/^$/d' "$MH_TEST_DIR/Mail/inbox/11" > "$MH_TEST_DIR/eom-align.inbox.body1" + sed -e '1,/^$/d' "$MH_TEST_DIR/Mail/inbox/12" > "$MH_TEST_DIR/eom-align.inbox.body2" + diff -u "$MH_TEST_DIR/eom-align.mbox.body" "$MH_TEST_DIR/eom-align.inbox.body1" + diff -u "$FILLER" "$MH_TEST_DIR/eom-align.inbox.body2" + rmm 11 12 +} + +# do_one_test_B sz +# Do a test type B +do_one_test_B () { + SZ=$1 + makembox_B "$MH_TEST_DIR/eom-align.mbox" $STDIO_BUFSZ + $VALGRIND inc -silent -file "$MH_TEST_DIR/eom-align.mbox" + # We know the message should be 11 in the inbox + sed -e '1,/^$/d' "$MH_TEST_DIR/Mail/inbox/11" > "$MH_TEST_DIR/eom-align.inbox.body1" + diff -u "$MH_TEST_DIR/eom-align.mbox.body" "$MH_TEST_DIR/eom-align.inbox.body1" + rmm 11 +} + + +# Cover a decent range around the stdio buffer size to make sure we catch +# any corner cases whether they relate to total message size equal to +# buffer size or to body size equal to buffer size. +START=$(($STDIO_BUFSZ - 16)) +FINISH=$(($STDIO_BUFSZ + $HDRSZ + $FROMLINESZ + 32)) +echo "Testing inc of files with various alignments of eom marker with buffer size..." +for sz in $(seq $START $FINISH); do + progress_update $sz $START $FINISH + do_one_test_A $sz + do_one_test_B $sz +done +progress_done -- 1.7.10.4