* [PATCH] makedumpfile: Fix the variable pfn_needed leaking @ 2014-11-11 8:54 Minfei Huang 2014-11-11 9:29 ` "Zhou, Wenjian/周文剑" 2014-11-12 12:05 ` Minfei Huang 0 siblings, 2 replies; 5+ messages in thread From: Minfei Huang @ 2014-11-11 8:54 UTC (permalink / raw) To: kexec; +Cc: Minfei Huang, kumagai-atsushi If the page pfn calculated by read_from_splitblock_table is bigger than pfn_needed, the variable pfn_needed will leak. makedumpfile cannot assign the pfn averagely bacause of condition pfn_needed invalid. Signed-off-by: Minfei Huang <mhuang@redhat.com> --- makedumpfile.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/makedumpfile.c b/makedumpfile.c index 59c4952..8807a90 100644 --- a/makedumpfile.c +++ b/makedumpfile.c @@ -8415,7 +8415,7 @@ calculate_end_pfn_by_splitblock(mdf_pfn_t start_pfn, return info->max_mapnr; mdf_pfn_t end_pfn; - long long pfn_needed, offset; + long long pfn_needed, offset, per_splitblock_pfn; char *splitblock_value_offset; pfn_needed = info->num_dumpable / info->num_dumpfile; @@ -8424,7 +8424,8 @@ calculate_end_pfn_by_splitblock(mdf_pfn_t start_pfn, end_pfn = start_pfn; while (*cur_splitblock_num < splitblock->num && pfn_needed > 0) { - pfn_needed -= read_from_splitblock_table(splitblock_value_offset); + per_splitblock_pfn = read_from_splitblock_table(splitblock_value_offset); + pfn_needed = pfn_needed < per_splitblock_pfn ? 0 : pfn_needed - per_splitblock_pfn; splitblock_value_offset += splitblock->entry_size; ++*cur_splitblock_num; } -- 1.8.3.1 _______________________________________________ kexec mailing list kexec@lists.infradead.org http://lists.infradead.org/mailman/listinfo/kexec ^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [PATCH] makedumpfile: Fix the variable pfn_needed leaking 2014-11-11 8:54 [PATCH] makedumpfile: Fix the variable pfn_needed leaking Minfei Huang @ 2014-11-11 9:29 ` "Zhou, Wenjian/周文剑" 2014-11-12 12:05 ` Minfei Huang 1 sibling, 0 replies; 5+ messages in thread From: "Zhou, Wenjian/周文剑" @ 2014-11-11 9:29 UTC (permalink / raw) To: kexec On 11/11/2014 04:54 PM, Minfei Huang wrote: > If the page pfn calculated by read_from_splitblock_table is bigger than > pfn_needed, the variable pfn_needed will leak. > > makedumpfile cannot assign the pfn averagely bacause of condition > pfn_needed invalid. > > Signed-off-by: Minfei Huang<mhuang@redhat.com> > --- > makedumpfile.c | 5 +++-- > 1 file changed, 3 insertions(+), 2 deletions(-) > > diff --git a/makedumpfile.c b/makedumpfile.c > index 59c4952..8807a90 100644 > --- a/makedumpfile.c > +++ b/makedumpfile.c > @@ -8415,7 +8415,7 @@ calculate_end_pfn_by_splitblock(mdf_pfn_t start_pfn, > return info->max_mapnr; > > mdf_pfn_t end_pfn; > - long long pfn_needed, offset; > + long long pfn_needed, offset, per_splitblock_pfn; > char *splitblock_value_offset; > > pfn_needed = info->num_dumpable / info->num_dumpfile; > @@ -8424,7 +8424,8 @@ calculate_end_pfn_by_splitblock(mdf_pfn_t start_pfn, > end_pfn = start_pfn; > > while (*cur_splitblock_num< splitblock->num&& pfn_needed> 0) { > - pfn_needed -= read_from_splitblock_table(splitblock_value_offset); > + per_splitblock_pfn = read_from_splitblock_table(splitblock_value_offset); > + pfn_needed = pfn_needed< per_splitblock_pfn ? 0 : pfn_needed - per_splitblock_pfn; > splitblock_value_offset += splitblock->entry_size; > ++*cur_splitblock_num; > } Hello Huang, Actually, pfn_needed is used to indicate whether the dumpfile have enough pfn or not. It doesn't matter whether pfn_needed == 0 or pfn_needed < 0. I know what you want to express. Maybe you can get some useful information at http://lists.infradead.org/pipermail/kexec/2014-October/012805.html -- Thanks Zhou Wenjian _______________________________________________ kexec mailing list kexec@lists.infradead.org http://lists.infradead.org/mailman/listinfo/kexec ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH] makedumpfile: Fix the variable pfn_needed leaking 2014-11-11 8:54 [PATCH] makedumpfile: Fix the variable pfn_needed leaking Minfei Huang 2014-11-11 9:29 ` "Zhou, Wenjian/周文剑" @ 2014-11-12 12:05 ` Minfei Huang 2014-11-13 0:59 ` "Zhou, Wenjian/周文剑" 1 sibling, 1 reply; 5+ messages in thread From: Minfei Huang @ 2014-11-12 12:05 UTC (permalink / raw) To: zhouwj-fnst; +Cc: kexec, kumagai-atsushi On 11/11/14 at 04:54pm, Minfei Huang wrote: > If the page pfn calculated by read_from_splitblock_table is bigger than > pfn_needed, the variable pfn_needed will leak. > > makedumpfile cannot assign the pfn averagely bacause of condition > pfn_needed invalid. > > Signed-off-by: Minfei Huang <mhuang@redhat.com> > --- > makedumpfile.c | 5 +++-- > 1 file changed, 3 insertions(+), 2 deletions(-) > > diff --git a/makedumpfile.c b/makedumpfile.c > index 59c4952..8807a90 100644 > --- a/makedumpfile.c > +++ b/makedumpfile.c > @@ -8415,7 +8415,7 @@ calculate_end_pfn_by_splitblock(mdf_pfn_t start_pfn, > return info->max_mapnr; > > mdf_pfn_t end_pfn; > - long long pfn_needed, offset; > + long long pfn_needed, offset, per_splitblock_pfn; > char *splitblock_value_offset; > > pfn_needed = info->num_dumpable / info->num_dumpfile; > @@ -8424,7 +8424,8 @@ calculate_end_pfn_by_splitblock(mdf_pfn_t start_pfn, > end_pfn = start_pfn; > > while (*cur_splitblock_num < splitblock->num && pfn_needed > 0) { > - pfn_needed -= read_from_splitblock_table(splitblock_value_offset); > + per_splitblock_pfn = read_from_splitblock_table(splitblock_value_offset); > + pfn_needed = pfn_needed < per_splitblock_pfn ? 0 : pfn_needed - per_splitblock_pfn; Hi, Wenjiang! Sorry, my emall client didnot receive the mail by you, so I reply it here. The split->table is an array to record the pfn count which we need dump. And the memory is divided by the size of info->splitblock_size, the pfn count in each entry will be stored in the entry of split->table. For the purpose, we want to average allocation to the pfns. Here is a case: There are 5 entries in the split->table, and the value is 4, 6, 4, 5, 5. We want to split four pieces to write to four files, and every file will be write 6 pfns. Using the function calculate_end_pfn_by_splitblock, the first file will be assigned all of the pfns(24 pfns). pfn_needed is 6((4+6+4+5+5) / 4) when entry the function. By the end of first loop, the variable pfn_needed = 2(6 - 4). Then move on, the variable will leak to become huge number by the end of second loop, because the return value of function read_from_splitblock_table is 6. The variable pfn_needed is ~4(2 - 6), it is huge. And the loop will break util *cur_splitblock_num == splitblock->num. For above case, it is no sense to use split function, so we should add the condition whether pfn_needed is bigger than the value of read_from_splitblock_table. Thanks Minfei > splitblock_value_offset += splitblock->entry_size; > ++*cur_splitblock_num; > } > -- > 1.8.3.1 > _______________________________________________ kexec mailing list kexec@lists.infradead.org http://lists.infradead.org/mailman/listinfo/kexec ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH] makedumpfile: Fix the variable pfn_needed leaking 2014-11-12 12:05 ` Minfei Huang @ 2014-11-13 0:59 ` "Zhou, Wenjian/周文剑" 2014-11-13 2:06 ` Minfei Huang 0 siblings, 1 reply; 5+ messages in thread From: "Zhou, Wenjian/周文剑" @ 2014-11-13 0:59 UTC (permalink / raw) To: Minfei Huang; +Cc: kexec On 11/12/2014 08:05 PM, Minfei Huang wrote: > On 11/11/14 at 04:54pm, Minfei Huang wrote: >> If the page pfn calculated by read_from_splitblock_table is bigger than >> pfn_needed, the variable pfn_needed will leak. >> >> makedumpfile cannot assign the pfn averagely bacause of condition >> pfn_needed invalid. >> >> Signed-off-by: Minfei Huang<mhuang@redhat.com> >> --- >> makedumpfile.c | 5 +++-- >> 1 file changed, 3 insertions(+), 2 deletions(-) >> >> diff --git a/makedumpfile.c b/makedumpfile.c >> index 59c4952..8807a90 100644 >> --- a/makedumpfile.c >> +++ b/makedumpfile.c >> @@ -8415,7 +8415,7 @@ calculate_end_pfn_by_splitblock(mdf_pfn_t start_pfn, >> return info->max_mapnr; >> >> mdf_pfn_t end_pfn; >> - long long pfn_needed, offset; >> + long long pfn_needed, offset, per_splitblock_pfn; >> char *splitblock_value_offset; >> >> pfn_needed = info->num_dumpable / info->num_dumpfile; >> @@ -8424,7 +8424,8 @@ calculate_end_pfn_by_splitblock(mdf_pfn_t start_pfn, >> end_pfn = start_pfn; >> >> while (*cur_splitblock_num< splitblock->num&& pfn_needed> 0) { >> - pfn_needed -= read_from_splitblock_table(splitblock_value_offset); >> + per_splitblock_pfn = read_from_splitblock_table(splitblock_value_offset); >> + pfn_needed = pfn_needed< per_splitblock_pfn ? 0 : pfn_needed - per_splitblock_pfn; > Hi, Wenjiang! > > Sorry, my emall client didnot receive the mail by you, so I reply it > here. > > The split->table is an array to record the pfn count which we need dump. > And the memory is divided by the size of info->splitblock_size, the pfn > count in each entry will be stored in the entry of split->table. > > For the purpose, we want to average allocation to the pfns. > > Here is a case: > There are 5 entries in the split->table, and the value is 4, 6, 4, 5, 5. > We want to split four pieces to write to four files, and every file will > be write 6 pfns. > Using the function calculate_end_pfn_by_splitblock, the first file will > be assigned all of the pfns(24 pfns). > > pfn_needed is 6((4+6+4+5+5) / 4) when entry the function. > By the end of first loop, the variable pfn_needed = 2(6 - 4). > Then move on, the variable will leak to become huge number by the end of > second loop, because the return value of function read_from_splitblock_table > is 6. The variable pfn_needed is ~4(2 - 6), it is huge. > And the loop will break util *cur_splitblock_num == splitblock->num. pfn_needed is (long long). If it is -4, won't the loop break? > > For above case, it is no sense to use split function, so we should add > the condition whether pfn_needed is bigger than the value of > read_from_splitblock_table. > > Thanks > Minfei >> splitblock_value_offset += splitblock->entry_size; >> ++*cur_splitblock_num; >> } >> -- >> 1.8.3.1 >> -- Thanks Zhou Wenjian _______________________________________________ kexec mailing list kexec@lists.infradead.org http://lists.infradead.org/mailman/listinfo/kexec ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH] makedumpfile: Fix the variable pfn_needed leaking 2014-11-13 0:59 ` "Zhou, Wenjian/周文剑" @ 2014-11-13 2:06 ` Minfei Huang 0 siblings, 0 replies; 5+ messages in thread From: Minfei Huang @ 2014-11-13 2:06 UTC (permalink / raw) To: "Zhou, Wenjian/周文剑"; +Cc: kexec On 11/13/14 at 08:59am, "Zhou, Wenjian/周文剑" wrote: > On 11/12/2014 08:05 PM, Minfei Huang wrote: > >On 11/11/14 at 04:54pm, Minfei Huang wrote: > >>If the page pfn calculated by read_from_splitblock_table is bigger than > >>pfn_needed, the variable pfn_needed will leak. > >> > >>makedumpfile cannot assign the pfn averagely bacause of condition > >>pfn_needed invalid. > >> > >>Signed-off-by: Minfei Huang<mhuang@redhat.com> > >>--- > >> makedumpfile.c | 5 +++-- > >> 1 file changed, 3 insertions(+), 2 deletions(-) > >> > >>diff --git a/makedumpfile.c b/makedumpfile.c > >>index 59c4952..8807a90 100644 > >>--- a/makedumpfile.c > >>+++ b/makedumpfile.c > >>@@ -8415,7 +8415,7 @@ calculate_end_pfn_by_splitblock(mdf_pfn_t start_pfn, > >> return info->max_mapnr; > >> > >> mdf_pfn_t end_pfn; > >>- long long pfn_needed, offset; > >>+ long long pfn_needed, offset, per_splitblock_pfn; > >> char *splitblock_value_offset; > >> > >> pfn_needed = info->num_dumpable / info->num_dumpfile; > >>@@ -8424,7 +8424,8 @@ calculate_end_pfn_by_splitblock(mdf_pfn_t start_pfn, > >> end_pfn = start_pfn; > >> > >> while (*cur_splitblock_num< splitblock->num&& pfn_needed> 0) { > >>- pfn_needed -= read_from_splitblock_table(splitblock_value_offset); > >>+ per_splitblock_pfn = read_from_splitblock_table(splitblock_value_offset); > >>+ pfn_needed = pfn_needed< per_splitblock_pfn ? 0 : pfn_needed - per_splitblock_pfn; > >Hi, Wenjiang! > > > >Sorry, my emall client didnot receive the mail by you, so I reply it > >here. > > > >The split->table is an array to record the pfn count which we need dump. > >And the memory is divided by the size of info->splitblock_size, the pfn > >count in each entry will be stored in the entry of split->table. > > > >For the purpose, we want to average allocation to the pfns. > > > >Here is a case: > >There are 5 entries in the split->table, and the value is 4, 6, 4, 5, 5. > >We want to split four pieces to write to four files, and every file will > >be write 6 pfns. > >Using the function calculate_end_pfn_by_splitblock, the first file will > >be assigned all of the pfns(24 pfns). > > > >pfn_needed is 6((4+6+4+5+5) / 4) when entry the function. > >By the end of first loop, the variable pfn_needed = 2(6 - 4). > >Then move on, the variable will leak to become huge number by the end of > >second loop, because the return value of function read_from_splitblock_table > >is 6. The variable pfn_needed is ~4(2 - 6), it is huge. > >And the loop will break util *cur_splitblock_num == splitblock->num. > > pfn_needed is (long long). If it is -4, won't the loop break? Oops! Sorry, I got a mistake. You are right. > > > > >For above case, it is no sense to use split function, so we should add > >the condition whether pfn_needed is bigger than the value of > >read_from_splitblock_table. > > > >Thanks > >Minfei > >> splitblock_value_offset += splitblock->entry_size; > >> ++*cur_splitblock_num; > >> } > >>-- > >>1.8.3.1 > >> > > > -- > Thanks > Zhou Wenjian > > _______________________________________________ > kexec mailing list > kexec@lists.infradead.org > http://lists.infradead.org/mailman/listinfo/kexec _______________________________________________ kexec mailing list kexec@lists.infradead.org http://lists.infradead.org/mailman/listinfo/kexec ^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2014-11-13 2:06 UTC | newest] Thread overview: 5+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2014-11-11 8:54 [PATCH] makedumpfile: Fix the variable pfn_needed leaking Minfei Huang 2014-11-11 9:29 ` "Zhou, Wenjian/周文剑" 2014-11-12 12:05 ` Minfei Huang 2014-11-13 0:59 ` "Zhou, Wenjian/周文剑" 2014-11-13 2:06 ` Minfei Huang
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.