Hi Denis,

> > ---
> >   src/sim.c |   77
> ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
> >   1 file changed, 76 insertions(+), 1 deletion(-)
> >
> > diff --git a/src/sim.c b/src/sim.c
> > index edae5eb..ef55b1c 100644
> > --- a/src/sim.c
> > +++ b/src/sim.c
> > @@ -123,6 +123,11 @@ struct msisdn_set_request {
> >     DBusMessage *msg;
> >   };
> >
> > +struct sim_locked_query_request {
> > +   struct ofono_sim *sim;
> > +   enum ofono_sim_password_type type;
> > +};
> > +
> >   struct service_number {
> >     char *id;
> >     struct ofono_phone_number ph;
> > @@ -610,6 +615,57 @@ error:
> >     return __ofono_error_invalid_args(msg);
> >   }
> >
> > +void sim_query_locked_cb(const struct ofono_error *error,
> > +                   int locked, void *data)
> > +{
> > +   struct sim_locked_query_request *req = data;
> > +   struct ofono_sim *sim = req->sim;
> > +   char **locked_pins;
> > +   DBusConnection *conn = ofono_dbus_get_connection();
> > +   const char *path = __ofono_atom_get_path(sim->atom);
> > +
> > +   DBG("");
> > +
> > +   if (error->type != OFONO_ERROR_TYPE_NO_ERROR) {
> > +           g_free(req);
> > +           return;
> > +   }
> > +
> > +   if (req->type >= OFONO_SIM_PASSWORD_SIM_PUK) {
> > +           g_free(req);
> > +           return;
> 
> This check seems to be pointless
> 
> > +   }
> > +
> > +   sim->locked_pins[req->type] = locked;
> > +   DBG("sim_query_locked_cb pin_type: %d %d", req->type, locked);
> > +
> > +   locked_pins = get_locked_pins(sim);
> > +   ofono_dbus_signal_array_property_changed(conn, path,
> > +                                           OFONO_SIM_MANAGER_INTERFACE,
> > +                                           "LockedPins", DBUS_TYPE_STRING,
> > +                                           &locked_pins);
> > +   g_strfreev(locked_pins);
> > +   g_free(req);
> > +}
> > +
> > +static void __sim_query_locked(struct ofono_sim *sim,
> > +                   enum ofono_sim_password_type type)
> 
> Why is this function prefixed by '__'?  The '__ofono' prefix is reserved for
> private APIs (e.g. functions that are not static, but not part of
> include/* public APIs).

Got it. I will change it.
> 
> > +{
> > +   struct sim_locked_query_request *req;
> > +
> > +   if (type == OFONO_SIM_PASSWORD_NONE
> > +           || type > OFONO_SIM_PASSWORD_PHCORP_PIN)
> > +           return;
> 
> This does not comply with our coding style guidelines.  Also, why do you
> bother checking type here since it is always guaranteed to be only
> OFONO_SIM_PASSWORD_SIM_PIN?
> 
Yes. only value between OFONO_SIM_PASSWORD_SIM_PIN and 
OFONO_SIM_PASSWORD_PHCORP_PIN is valid.
Other PUK relative value is invalid.

> > +
> > +   req = g_new0(struct sim_locked_query_request, 1);
> > +   req->sim = sim;
> > +   req->type = type;
> 
> This is wrong, see below:
> 
> > +
> > +   if (sim->driver->query_locked)
> > +           sim->driver->query_locked(sim, type, sim_query_locked_cb, req);
> 
> The oFono driver calling semantics do not allow for a cleanup handler.
> So if the modem hardware crashes or is removed in the time between you
> submit the request to the driver and the driver returns with the result, you 
> will
> incur a memory leak.
> 
In any case, the callback (sim_query_locked_cb) will be invoked. If only the 
callback is called,
"req" will be freed. If I am wrong, please correct me.

> > +}
> > +
> > +
> >   static void sim_locked_cb(struct ofono_sim *sim, gboolean locked)
> >   {
> >     DBusConnection *conn = ofono_dbus_get_connection(); @@ -1039,6
> > +1095,25 @@ static DBusMessage *sim_get_icon(DBusConnection *conn,
> >     return NULL;
> >   }
> >
> > +static void sim_reset_pin_cb(const struct ofono_error *error, void
> > +*data) {
> > +   struct ofono_sim *sim = data;
> > +   DBusMessage *reply;
> > +   enum ofono_sim_password_type type;
> > +
> > +   if (error->type != OFONO_ERROR_TYPE_NO_ERROR)
> > +           reply = __ofono_error_failed(sim->pending);
> > +   else
> > +           reply = dbus_message_new_method_return(sim->pending);
> > +
> > +   __ofono_dbus_pending_reply(&sim->pending, reply);
> > +
> > +   __ofono_sim_recheck_pin(sim);
> > +
> > +   for (type = OFONO_SIM_PASSWORD_SIM_PIN; type <
> OFONO_SIM_PASSWORD_SIM_PUK; type++)
> > +           __sim_query_locked(sim, type);
> 
> Why do you need this in the first place.  Are you suggesting that by 
> unblocking
> the SIM PIN it somehow has the side-effect of also resetting the SIM lock
> status?
> 
It is true for IMC modem. After reset SIM PIN, the SIM PIN locking is changed. 
I doubt this is an issue of
IMC modem. Following is the log:

> AT+CLCK="SC",2
< \r\n+CLCK: 0\r\n
< \r\nOK\r\n

> AT+CLCK="SC",1,"1111"
< \r\nERROR\r\n

> AT+CMEE=1
< \r\nOK\r\n

> AT+CLCK="SC",1,"1111"
< \r\n+CME ERROR: 16\r\n

> AT+CLCK="SC",1,"1111"
< \r\n+CME ERROR: 12\r\n

> AT+CPIN="13570794","1234"
< \r\nOK\r\n

> AT+CLCK="SC",2
< \r\n+CLCK: 1\r\n
< \r\nOK\r\n

To be safe, query SIM PIN locked information after reset sim pin.

> > +}
> > +
> >   static DBusMessage *sim_reset_pin(DBusConnection *conn,
> DBusMessage *msg,
> >                                     void *data)
> >   {
> > @@ -1074,7 +1149,7 @@ static DBusMessage
> *sim_reset_pin(DBusConnection *conn, DBusMessage *msg,
> >             return __ofono_error_invalid_format(msg);
> >
> >     sim->pending = dbus_message_ref(msg);
> > -   sim->driver->reset_passwd(sim, puk, pin, sim_enter_pin_cb, sim);
> > +   sim->driver->reset_passwd(sim, puk, pin, sim_reset_pin_cb, sim);
> >
> >     return NULL;
> >   }
> >
> 
Regards,
Caiwen
_______________________________________________
ofono mailing list
[email protected]
https://lists.ofono.org/mailman/listinfo/ofono

Reply via email to