[Lldb-commits] [review request] fix bug that allows users to re-define commands
Jim Ingham
jingham at apple.com
Wed Feb 20 15:13:51 PST 2013
Ah, I understand now. Yeah, the API is a little weird because you are passing a flag saying "Let me replace an extant command if the extant command agrees to be replaced." which seems a little over-specified. But given that, Enrico is right and I was misreading the code.
Jim
On Feb 20, 2013, at 3:00 PM, Enrico Granata <egranata at apple.com> wrote:
> Daniel,
> I am pretty sure this test case used to pass. However, I did reproduce the failure you see.
>
> As for fixing it, I am not sure passing "false" there would be the right thing. Doing so would make it impossible for users to replace their own scripted commands.
> If you look at AddUserCommand(), it says:
>
> // do not allow replacement of internal commands
> if (CommandExists(name_cstr))
> {
> if (can_replace == false)
> return false;
> if (m_command_dict[name]->IsRemovable() == false)
> return false;
> }
>
> Regardless of can_replace, a command can explicitly mark itself as non-removable, and that is the way system commands are supposed to be marked.
> If you look at CommandObjectFrame, it is a MultiwordCommand, and for these:
>
> virtual bool
> IsRemovable() const { return m_can_be_removed; }
>
> The *real* bug seems to be that m_can_be_removed is never initialized when the constructor runs.
>
> My proposed fix (I have not prepared a patch for it because I am currently busy with a different task):
> a) the constructor for CommandObjectMultiword should initialize m_can_be_removed - my guess is that the default value should be false (because that is also the default for CommandObject)
> b) if necessary, individual multiword commands can change the value of the flag - or third-parties can call SetRemovable() - with the right value
>
> As a side note, plugin multiword commands already get this right by calling SetRemovable(true) (SBCommandInterpeter.cpp lines 416 and 470)
>
> I will gladly appreciate any feedback on this proposal.
> Assuming there are no objections, Daniel, feel free to write a patch to this effect, or if you are already busy, let me know and I will do this ASAP.
>
> Thanks,
> Enrico Granata
> ✉ egranata@.com
> ✆ 27683
>
> On Feb 20, 2013, at 2:36 PM, "Malea, Daniel" <daniel.malea at intel.com> wrote:
>
>> Hi,
>>
>> I noticed the TestCommandScript.py test case is failing one line 118, where it verifies that a user cannot redefine a command named 'frame'.
>>
>> I believe the failure is due to CommandObjectCommands.cpp passing the wrong value (true) for the 'can_replace' parameter to CommandInterpreter::AddUserCommand… When this is set to 'true', which allows the test-case to re-define the 'frame' command to be something else.
>>
>> Attached patch should fix it. Any concerns/comments, or can I commit this as-is?
>>
>> I'm still not exactly sure how CommandObjectCommands works, and why there's two code paths that end up calling AddUserCommand..so I figured I'd run it by the list first.
>>
>>
>> Dan
>>
>>
>> <fix_test_command_script.patch>
>>
>
> _______________________________________________
> lldb-commits mailing list
> lldb-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/lldb-commits
More information about the lldb-commits
mailing list