/* simplify */
gcd = gst_util_greatest_common_divisor (N, D);
- N /= gcd;
- D /= gcd;
+ if (gcd) {
+ N /= gcd;
+ D /= gcd;
+ }
/* set results */
*dest_n = N;
g_return_val_if_fail (b_d != 0, FALSE);
gcd = gst_util_greatest_common_divisor (a_n, b_d);
- a_n /= gcd;
- b_d /= gcd;
+ if (gcd) {
+ a_n /= gcd;
+ b_d /= gcd;
+ }
+
gcd = gst_util_greatest_common_divisor (a_d, b_n);
- a_d /= gcd;
- b_n /= gcd;
+ if (gcd) {
+ a_d /= gcd;
+ b_n /= gcd;
+ }
- g_return_val_if_fail (a_n == 0 || G_MAXINT / ABS (a_n) >= ABS (b_n), FALSE);
- g_return_val_if_fail (G_MAXINT / ABS (a_d) >= ABS (b_d), FALSE);
+ /* This would result in overflow */
+ if (a_n != 0 && G_MAXINT / ABS (a_n) < ABS (b_n))
+ return FALSE;
+ if (G_MAXINT / ABS (a_d) < ABS (b_d))
+ return FALSE;
*res_n = a_n * b_n;
*res_d = a_d * b_d;
+
gcd = gst_util_greatest_common_divisor (*res_n, *res_d);
- *res_n /= gcd;
- *res_d /= gcd;
+ if (gcd) {
+ *res_n /= gcd;
+ *res_d /= gcd;
+ }
return TRUE;
}
return TRUE;
}
- g_return_val_if_fail (a_n == 0 || G_MAXINT / ABS (a_n) >= ABS (b_n), FALSE);
- g_return_val_if_fail (G_MAXINT / ABS (a_d) >= ABS (b_d), FALSE);
- g_return_val_if_fail (G_MAXINT / ABS (a_d) >= ABS (b_d), FALSE);
+ /* This would result in overflow */
+ if (G_MAXINT / ABS (a_n) < ABS (b_n))
+ return FALSE;
+ if (G_MAXINT / ABS (a_d) < ABS (b_d))
+ return FALSE;
+ if (G_MAXINT / ABS (a_d) < ABS (b_d))
+ return FALSE;
*res_n = (a_n * b_d) + (a_d * b_n);
*res_d = a_d * b_d;
gcd = gst_util_greatest_common_divisor (*res_n, *res_d);
- *res_n /= gcd;
- *res_d /= gcd;
+ if (gcd) {
+ *res_n /= gcd;
+ *res_d /= gcd;
+ }
return TRUE;
}