/soc/2015/jgeboski/facebook: 2d85594bb9ee: facebook: fixed JSON ...
James Geboski
jgeboski at gmail.com
Tue Jun 23 17:16:16 EDT 2015
Changeset: 2d85594bb9ee9913178ef6b6e70f092398b54a49
Author: James Geboski <jgeboski at gmail.com>
Date: 2015-06-22 16:46 -0400
Branch: facebook
URL: https://hg.pidgin.im/soc/2015/jgeboski/facebook/rev/2d85594bb9ee
Description:
facebook: fixed JSON parse errors with messages
It was assumed there was always a leading "NULL" byte prepended to each
message. This is not the case, the NULL byte is actually a variable
integer, which is the size for a Thrift string. In order to navigate
directly the JSON data, just read the data as a thrift string in order
to obtain the offset of the JSON data.
diffstat:
libpurple/protocols/facebook/api.c | 12 ++++++++++--
libpurple/protocols/facebook/thrift.c | 20 ++++++++++++++++++++
libpurple/protocols/facebook/thrift.h | 6 ++++++
3 files changed, 36 insertions(+), 2 deletions(-)
diffs (80 lines):
diff --git a/libpurple/protocols/facebook/api.c b/libpurple/protocols/facebook/api.c
--- a/libpurple/protocols/facebook/api.c
+++ b/libpurple/protocols/facebook/api.c
@@ -647,6 +647,7 @@ fb_api_cb_publish_ms(FbApi *api, const G
const gchar *str;
FbApiMessage msg;
FbApiPrivate *priv = api->priv;
+ FbThrift *thft;
GError *err = NULL;
gint64 tid;
gint64 uid;
@@ -654,13 +655,20 @@ fb_api_cb_publish_ms(FbApi *api, const G
GList *l;
gpointer mptr;
GSList *msgs = NULL;
+ guint i;
JsonArray *arr;
JsonNode *mode;
JsonNode *node;
JsonNode *root;
- /* Start at 1 to skip the NULL byte */
- if (!fb_api_json_chk(api, pload->data + 1, pload->len - 1, &root)) {
+ thft = fb_thrift_new((GByteArray*) pload, 0, TRUE);
+ fb_thrift_read_str(thft, NULL);
+ i = fb_thrift_get_pos(thft);
+ g_object_unref(thft);
+
+ g_return_if_fail(i < pload->len);
+
+ if (!fb_api_json_chk(api, pload->data + i, pload->len - i, &root)) {
return;
}
diff --git a/libpurple/protocols/facebook/thrift.c b/libpurple/protocols/facebook/thrift.c
--- a/libpurple/protocols/facebook/thrift.c
+++ b/libpurple/protocols/facebook/thrift.c
@@ -88,6 +88,26 @@ fb_thrift_new(GByteArray *bytes, guint o
return thft;
}
+guint
+fb_thrift_get_pos(FbThrift *thft)
+{
+ FbThriftPrivate *priv;
+
+ g_return_val_if_fail(FB_IS_THRIFT(thft), 0);
+ priv = thft->priv;
+ return priv->pos;
+}
+
+void
+fb_thrift_set_pos(FbThrift *thft, guint pos)
+{
+ FbThriftPrivate *priv;
+
+ g_return_if_fail(FB_IS_THRIFT(thft));
+ priv = thft->priv;
+ priv->pos = pos;
+}
+
void
fb_thrift_reset(FbThrift *thft)
{
diff --git a/libpurple/protocols/facebook/thrift.h b/libpurple/protocols/facebook/thrift.h
--- a/libpurple/protocols/facebook/thrift.h
+++ b/libpurple/protocols/facebook/thrift.h
@@ -84,6 +84,12 @@ fb_thrift_get_type(void);
FbThrift *
fb_thrift_new(GByteArray *bytes, guint offset, gboolean compact);
+guint
+fb_thrift_get_pos(FbThrift *thft);
+
+void
+fb_thrift_set_pos(FbThrift *thft, guint pos);
+
void
fb_thrift_reset(FbThrift *thft);
More information about the Commits
mailing list