On 8/1/2026 10:11 PM, Jamal Hadi Salim wrote:
> On Sat, Aug 1, 2026 at 9:42 AM Ren Wei <[email protected]> wrote:
>>
>> From: Zijie Huang <[email protected]>
>>
>> Deep qdisc hierarchies can lead to excessive recursion in qdisc tree
>> walkers and exhaust the kernel stack. The existing loop check does not
>> cover the create-and-graft path, so a hierarchy can still be extended by
>> creating a new child qdisc below an already deep parent.
>>
>> Store the hierarchy depth in struct Qdisc and update it when qdiscs are
>> grafted. Reject new child qdiscs once the parent is already at the maximum
>> allowed depth.
>>
>> Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2")
>> Cc: [email protected]
>> Reported-by: Vega <[email protected]>
>> Assisted-by: Codex:gpt-5.4
>> Signed-off-by: Zijie Huang <[email protected]>
>> Signed-off-by: Ren Wei <[email protected]>
>
>
> This is the same patch i sent you except you changed the failure path
> to send EBIG instead of ELOOP. Is there a reason?
> And your feedback message is not as informative like what i had.
> NL_SET_ERR_MSG(extack, "Qdisc hierarchy too deep (max 7)");
> This way the user doesnt have to dig to find what the limit is.
>
> Note: Your AI did not assist in this patch rather, I spent about 30
> minutes looking closely using human knowledge.
> I am not looking for credit but for your education going forward: if
> someone invests their time reviewing your AI generated patches and
> suggests a different path that you adopt, please add a suggested-by
> tag crediting them.
> Or don't bother sending any patches, just report the problem and
> provide the Poc, I could have come up with that patch in about the
> same time investment.
>
> I am going to ack the series unless someone complains about EBIG vs
> ELOOP in which case please fix the msg..
>
> cheers,
> jamal

I apologize for the inconvenience. This is my first time try contributing
to  some big open source community like linux. I believe I should have
learned about etiquette like "suggested-by" beforehand.

In reality, I checked similar code paths about exceeding depth in the
repository and found that E2BIG is more common so I replaced ELOOP with
that. And after reviewing the issue, I think the patch you provided is
enough to cover the problem, so I didn't change a lot.

Again, I apologize for the inconvenience and appreciate your patience.

>> changes in v2:
>>   - Store the qdisc hierarchy depth in struct Qdisc and update it from
>>     qdisc_graft(), instead of walking the parent chain.
>>   - Move the depth check to qdisc_graft() so it is applied at the actual
>>     attach point.
>>   - Add tdc tests for the maximum allowed depth and rejection above it.
>>   - v1 Link: 
>>https://lore.kernel.org/all/[email protected]/
>>
>>
>>  include/net/sch_generic.h | 1 +
>>  net/sched/sch_api.c       | 9 +++++++++
>>  2 files changed, 10 insertions(+)
>>
>> diff --git a/include/net/sch_generic.h b/include/net/sch_generic.h
>> index 45a1e8c78222..cbc248776511 100644
>> --- a/include/net/sch_generic.h
>> +++ b/include/net/sch_generic.h
>> @@ -99,6 +99,7 @@ struct Qdisc {
>>         struct hlist_node       hash;
>>         u32                     handle;
>>         u32                     parent;
>> +       int                     depth;
>>
>>         struct netdev_queue     *dev_queue;
>>
>> diff --git a/net/sched/sch_api.c b/net/sched/sch_api.c
>> index 668bcd60d183..65b35528d125 100644
>> --- a/net/sched/sch_api.c
>> +++ b/net/sched/sch_api.c
>> @@ -1114,6 +1114,9 @@ static int qdisc_graft(struct net_device *dev, struct 
>> Qdisc *parent,
>>                 unsigned int i, num_q, ingress;
>>                 struct netdev_queue *dev_queue;
>>
>> +               if (new)
>> +                       new->depth = 0;
>> +
>>                 ingress = 0;
>>                 num_q = dev->num_tx_queues;
>>                 if ((q && q->flags & TCQ_F_INGRESS) ||
>> @@ -1211,9 +1214,15 @@ static int qdisc_graft(struct net_device *dev, struct 
>> Qdisc *parent,
>>                         NL_SET_ERR_MSG(extack, "STAB not supported on a non 
>>root");
>>                         return -EINVAL;
>>                 }
>> +               if (new && parent->depth >= 7) {
>> +                       NL_SET_ERR_MSG(extack, "Qdisc hierarchy is too 
>> deep");
>> +                       return -E2BIG;
>> +               }
>>                 err = cops->graft(parent, cl, new, &old, extack);
>>                 if (err)
>>                         return err;
>> +               if (new)
>> +                       new->depth = parent->depth + 1;
>>                 notify_and_destroy(net, skb, n, classid, old, new, extack);
>>         }
>>         return 0;
>> --
>> 2.47.2
>>


Reply via email to