- qmf/qpid doesn't allow null as an acceptable return argument so raising an exception to alert end user of possible status conflicts resolves rhbz 733384, 733451
Signed-off-by: Adam Stokes astokes@fedoraproject.org --- src/sysconfig/sysconfig-qmf.cpp | 13 +++++++++++++ 1 files changed, 13 insertions(+), 0 deletions(-)
diff --git a/src/sysconfig/sysconfig-qmf.cpp b/src/sysconfig/sysconfig-qmf.cpp index 442d27a..2966135 100644 --- a/src/sysconfig/sysconfig-qmf.cpp +++ b/src/sysconfig/sysconfig-qmf.cpp @@ -93,6 +93,9 @@ ConfigAgent::invoke(qmf::AgentSession session, qmf::AgentEvent event, gpointer u args["scheme"].asString().c_str(), args["key"].asString().c_str()); status = mh_sysconfig_is_configured(args["key"].asString().c_str()); + if (!status) { + goto bail; + } event.addReturnArgument("status", status); } else if (methodName == "run_string") { mh_sysconfig_run_string(args["data"].asString().c_str(), @@ -100,15 +103,24 @@ ConfigAgent::invoke(qmf::AgentSession session, qmf::AgentEvent event, gpointer u args["scheme"].asString().c_str(), args["key"].asString().c_str()); status = mh_sysconfig_is_configured(args["key"].asString().c_str()); + if (!status) { + goto bail; + } event.addReturnArgument("status", status); } else if (methodName == "query") { const char *data = NULL; data = mh_sysconfig_query(args["query"].asString().c_str(), args["flags"].asUint32(), args["scheme"].asString().c_str()); + if (!data) { + goto bail; + } event.addReturnArgument("query", data); } else if (methodName == "is_configured") { status = mh_sysconfig_is_configured(args["key"].asString().c_str()); + if (!status) { + goto bail; + } _instance.setProperty("is_postboot_configured", status); event.addReturnArgument("status", status); } else { @@ -120,5 +132,6 @@ ConfigAgent::invoke(qmf::AgentSession session, qmf::AgentEvent event, gpointer u session.methodSuccess(event);
bail: + session.raiseException(event, "Error in return arguments"); return TRUE; }
On 08/25/2011 11:51 PM, Adam Stokes wrote:
- qmf/qpid doesn't allow null as an acceptable return argument so raising an exception to alert end user of possible status conflicts resolves rhbz 733384, 733451
} else if (methodName == "is_configured") { status = mh_sysconfig_is_configured(args["key"].asString().c_str());
if (!status) {
goto bail;
}
What does a NULL return from mh_sysconfig_is_configured() really mean? Is it just that a configuration request with this key hasn't been attempted? I don't think we should raise an exception on these cases. I think we should just handle it gracefully.
addReturnArgument("status", status ? status : "unknown");
The valid values for the return status should be documented in src/sysconfig/schema.xml, as well.
On Fri, 26 Aug 2011 07:41:34 -0400 Russell Bryant rbryant@redhat.com wrote:
On 08/25/2011 11:51 PM, Adam Stokes wrote:
- qmf/qpid doesn't allow null as an acceptable return argument so raising an exception to alert end user of possible status conflicts resolves rhbz 733384, 733451
} else if (methodName == "is_configured") { status =
mh_sysconfig_is_configured(args["key"].asString().c_str());
if (!status) {
goto bail;
}
What does a NULL return from mh_sysconfig_is_configured() really mean? Is it just that a configuration request with this key hasn't been attempted? I don't think we should raise an exception on these cases. I think we should just handle it gracefully.
addReturnArgument("status", status ? status : "unknown");
I did try this but an exception was still occuring telling me null is not valid.
On Fri, 26 Aug 2011 08:17:00 -0400 Adam Stokes ajs@redhat.com wrote:
On Fri, 26 Aug 2011 07:41:34 -0400 Russell Bryant rbryant@redhat.com wrote:
On 08/25/2011 11:51 PM, Adam Stokes wrote:
- qmf/qpid doesn't allow null as an acceptable return argument so raising an exception to alert end user of possible status conflicts resolves rhbz 733384, 733451
} else if (methodName == "is_configured") { status =
mh_sysconfig_is_configured(args["key"].asString().c_str());
if (!status) {
goto bail;
}
What does a NULL return from mh_sysconfig_is_configured() really mean? Is it just that a configuration request with this key hasn't been attempted? I don't think we should raise an exception on these cases. I think we should just handle it gracefully.
addReturnArgument("status", status ? status : "unknown");
I did try this but an exception was still occuring telling me null is not valid. _______________________________________________ Matahari mailing list Matahari@lists.fedorahosted.org https://fedorahosted.org/mailman/listinfo/matahari
Here is the error with the above implemented:
terminate called after throwing an instance of 'qmf::QmfException' what(): Output argument is unknown or the type is incompatible
(gdb) bt #0 0x00000034688352d5 in __GI_raise (sig=6) at ../nptl/sysdeps/unix/sysv/linux/raise.c:64 #1 0x0000003468836beb in __GI_abort () at abort.c:93 #2 0x000000346e8bbffd in __gnu_cxx::__verbose_terminate_handler() () from /usr/lib64/libstdc++.so.6 #3 0x000000346e8ba1b6 in ?? () from /usr/lib64/libstdc++.so.6 #4 0x000000346e8ba1e3 in std::terminate() () from /usr/lib64/libstdc++.so.6 #5 0x000000346e8ba2de in __cxa_throw () from /usr/lib64/libstdc++.so.6 #6 0x000000346dc2c5c0 in qmf::AgentEventImpl::addReturnArgument(std::string const&, qpid::types::Variant const&, std::string const&) () from /usr/lib64/libqmf2.so.1 #7 0x000000000040436b in ConfigAgent::invoke (this=<optimized out>, session=..., event=..., user_data=<optimized out>) at /home/akimbo/hacking/projects/matahari/src/sysconfig/sysconfig-qmf.cpp:115 #8 0x00007fe7d8c7226a in mh_qpid_callback (session=..., event=..., user_data=0x7fff8e08bb40) at /home/akimbo/hacking/projects/matahari/src/lib/mh_agent.cpp:128 #9 0x00007fe7d8c72091 in mainloop_qmf_dispatch (source=0x20a1000, callback=<optimized out>, userdata=<optimized out>) at /home/akimbo/hacking/projects/matahari/src/lib/mh_agent.cpp:580 #10 0x000000346a8427ed in g_main_dispatch (context=0x20a0b10) at gmain.c:2441 #11 g_main_context_dispatch (context=0x20a0b10) at gmain.c:3014 #12 0x000000346a842fc8 in g_main_context_iterate (context=0x20a0b10, block=<optimized out>, dispatch=1, self=<optimized out>) at gmain.c:3092 #13 0x000000346a84360d in g_main_loop_run (loop=0x2098b20) at gmain.c:3300 #14 0x00000000004027d3 in main (argc=3, argv=<optimized out>) at /home/akimbo/hacking/projects/matahari/src/sysconfig/sysconfig-qmf.cpp:59 (gdb) f 7 #7 0x000000000040436b in ConfigAgent::invoke (this=<optimized out>, session=..., event=..., user_data=<optimized out>) at /home/akimbo/hacking/projects/matahari/src/sysconfig/sysconfig-qmf.cpp:115 115 event.addReturnArgument("query", data ? data : "unknown"); (gdb) l 110 } else if (methodName == "query") { 111 const char *data = NULL; 112 data = mh_sysconfig_query(args["query"].asString().c_str(), 113 args["flags"].asUint32(), 114 args["scheme"].asString().c_str()); 115 event.addReturnArgument("query", data ? data : "unknown"); 116 } else if (methodName == "is_configured") { 117 status = mh_sysconfig_is_configured(args["key"].asString().c_str()); 118 if (!status) { 119 goto bail;
On 08/26/2011 08:25 AM, Adam Stokes wrote:
On Fri, 26 Aug 2011 08:17:00 -0400 Adam Stokesajs@redhat.com wrote:
On Fri, 26 Aug 2011 07:41:34 -0400 Russell Bryantrbryant@redhat.com wrote:
What does a NULL return from mh_sysconfig_is_configured() really mean? Is it just that a configuration request with this key hasn't been attempted? I don't think we should raise an exception on these cases. I think we should just handle it gracefully.
addReturnArgument("status", status ? status : "unknown");
I did try this but an exception was still occuring telling me null is not valid. _______________________________________________ Matahari mailing list Matahari@lists.fedorahosted.org https://fedorahosted.org/mailman/listinfo/matahari
Here is the error with the above implemented:
terminate called after throwing an instance of 'qmf::QmfException' what(): Output argument is unknown or the type is incompatible
(gdb) bt #0 0x00000034688352d5 in __GI_raise (sig=6) at ../nptl/sysdeps/unix/sysv/linux/raise.c:64 #1 0x0000003468836beb in __GI_abort () at abort.c:93 #2 0x000000346e8bbffd in __gnu_cxx::__verbose_terminate_handler() () from /usr/lib64/libstdc++.so.6 #3 0x000000346e8ba1b6 in ?? () from /usr/lib64/libstdc++.so.6 #4 0x000000346e8ba1e3 in std::terminate() () from /usr/lib64/libstdc++.so.6 #5 0x000000346e8ba2de in __cxa_throw () from /usr/lib64/libstdc++.so.6 #6 0x000000346dc2c5c0 in qmf::AgentEventImpl::addReturnArgument(std::string const&, qpid::types::Variant const&, std::string const&) () from /usr/lib64/libqmf2.so.1 #7 0x000000000040436b in ConfigAgent::invoke (this=<optimized out>, session=..., event=..., user_data=<optimized out>) at /home/akimbo/hacking/projects/matahari/src/sysconfig/sysconfig-qmf.cpp:115 #8 0x00007fe7d8c7226a in mh_qpid_callback (session=..., event=..., user_data=0x7fff8e08bb40) at /home/akimbo/hacking/projects/matahari/src/lib/mh_agent.cpp:128 #9 0x00007fe7d8c72091 in mainloop_qmf_dispatch (source=0x20a1000, callback=<optimized out>, userdata=<optimized out>) at /home/akimbo/hacking/projects/matahari/src/lib/mh_agent.cpp:580 #10 0x000000346a8427ed in g_main_dispatch (context=0x20a0b10) at gmain.c:2441 #11 g_main_context_dispatch (context=0x20a0b10) at gmain.c:3014 #12 0x000000346a842fc8 in g_main_context_iterate (context=0x20a0b10, block=<optimized out>, dispatch=1, self=<optimized out>) at gmain.c:3092 #13 0x000000346a84360d in g_main_loop_run (loop=0x2098b20) at gmain.c:3300 #14 0x00000000004027d3 in main (argc=3, argv=<optimized out>) at /home/akimbo/hacking/projects/matahari/src/sysconfig/sysconfig-qmf.cpp:59 (gdb) f 7 #7 0x000000000040436b in ConfigAgent::invoke (this=<optimized out>, session=..., event=..., user_data=<optimized out>) at /home/akimbo/hacking/projects/matahari/src/sysconfig/sysconfig-qmf.cpp:115 115 event.addReturnArgument("query", data ? data : "unknown"); (gdb) l 110 } else if (methodName == "query") { 111 const char *data = NULL; 112 data = mh_sysconfig_query(args["query"].asString().c_str(), 113 args["flags"].asUint32(), 114 args["scheme"].asString().c_str()); 115 event.addReturnArgument("query", data ? data : "unknown"); 116 } else if (methodName == "is_configured") { 117 status = mh_sysconfig_is_configured(args["key"].asString().c_str()); 118 if (!status) { 119 goto bail;
The error here isn't the return value, is the _name_ of the return parameter. The code is setting the return parameter called "query", but the schema has it defined as "data".
matahari@lists.fedorahosted.org